Java Hibernate:本机SQL查询重复列结果
在Hibernate环境中执行以下本机SQL查询时,我遇到一些奇怪的问题:Java Hibernate:本机SQL查询重复列结果,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,在Hibernate环境中执行以下本机SQL查询时,我遇到一些奇怪的问题: public List<Object[]> getExcelResults(Integer idSurvey) { StringBuffer queryString = new StringBuffer(); //build query string queryString.append("select s.idSection, s.description as sectionDes
public List<Object[]> getExcelResults(Integer idSurvey)
{
StringBuffer queryString = new StringBuffer();
//build query string
queryString.append("select s.idSection, s.description as sectionDescription, ");
queryString.append("q.idQuestion, q.description as questionDescription, q.type, ");
queryString.append("a.idAnswer, a.description, ");
queryString.append("sum(sa.checked), avg(sa.value), count(sl.idSurveyLog) ");
queryString.append("from surveylog sl ");
queryString.append("inner join surveyanswerlog sa ");
queryString.append("on sl.idSurveyLog = sa.idSurveyLog ");
queryString.append("inner join answer a ");
queryString.append("on sa.idAnswer = a.idAnswer ");
queryString.append("inner join question q ");
queryString.append("on a.idQuestion = q.idQuestion ");
queryString.append("inner join section s ");
queryString.append("on q.idSection = s.idSection ");
queryString.append("where sl.idSurvey = :idSurvey ");
queryString.append("group by s.idSection, q.idQuestion, a.idAnswer ");
queryString.append("order by s.idSection, q.idQuestion, a.idAnswer asc; ");
//create query
Query query = this.sessionFactory.getCurrentSession().createSQLQuery(queryString.toString());
query.setInteger("idSurvey", idSurvey);
return query.list();
}
公共列表getExcelResults(整数idSurvey)
{
StringBuffer queryString=新的StringBuffer();
//生成查询字符串
追加(“选择s.idSection,s.description作为sectionDescription,”);
追加(“q.idQuestion,q.description作为questionDescription,q.type,”);
追加(“a.idAnswer,a.description,”);
追加(“sum(sa.checked)、avg(sa.value)、count(sl.idSurveyLog)”;
queryString.append(“来自surveylog sl”);
append(“内部连接调查”和swerlog sa);
append(“on sl.idSurveyLog=sa.idSurveyLog”);
append(“内部连接答案a”);
追加(“on sa.idAnswer=a.idAnswer”);
追加(“内部连接问题q”);
append(“on a.idQuestion=q.idQuestion”);
append(“内部连接节s”);
append(“on q.idSection=s.idSection”);
append(“其中sl.idSurvey=:idSurvey”);
追加(“按s.idSection、q.idQuestion、a.idAnswer分组”);
追加(“s.idSection,q.idQuestion,a.idAnswer asc;”下的订单;
//创建查询
Query Query=this.sessionFactory.getCurrentSession().createSQLQuery(queryString.toString());
setInteger(“idSurvey”,idSurvey);
返回query.list();
}
如果查看返回的属性,您会注意到三个不同表中有三个description
字段。我遇到的问题是,a.description
列的值在数组位置被复制,这些位置应该对应于s.description
和q.description
例如,如果我有一个结果行,例如:
[1,“A部分”,1,“问题A”,1,1,“回答A”,2,2,2]
Hibernate将为该行返回不正确的对象[]
,例如:
[1,“回答A”,1,“回答A”,1,1,“回答A”,2,2,2]
起初,我认为我需要使用别名,因为所有这些列都有相同的名称,但从上面的代码中可以看出,a.description
没有别名。这样做的原因是,如果我将别名添加到所有三个列中,我会得到一个sqlexception,其读取列“description”notfound。我完全被难住了,好像代码在嘲笑我
更奇怪的是,如果我从控制台获取生成的SQL查询并在MySQL上运行它,它就可以正常工作。我怀疑我可能有一些打字错误,但我已经看了这么长时间的代码,我再也看不到任何东西了。您应该对所有查询投影使用
addScalar
方法。比如说,
Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString.toString())
.addScalar("sectionDescription", StandardBasicTypes.STRING)
.addScalar("questionDescription", StandardBasicTypes.STRING)
.setInteger("idSurvey", idSurvey);
请注意:使用+连接查询的各个部分将更具可读性和效率。谢谢,我正在测试这个,但由于某些原因,我找不到对StandardBasicTypes的引用。你知道这是哪一个Jar,或者用另一种方式设置该类型吗?
org.hibernate.type.StandardBasicTypes
。它位于核心jar文件hibernate-core-4.1.9.Final.jar
中。也许你用的是非常旧的版本?我用的是版本3。我将为该版本寻找等效版本。谢谢。啊,是的,就是这样。该常量对应的hibernate 3是hibernate.STRING