Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:本机SQL查询重复列结果_Java_Mysql_Sql_Hibernate - Fatal编程技术网

Java 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

在Hibernate环境中执行以下本机SQL查询时,我遇到一些奇怪的问题:

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