2

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();
}

返されるプロパティを見ると、description3つの異なるテーブルから3つのフィールドがあることがわかります。私が抱えている問題は、列の値がとに対応a.descriptionするはずの配列位置に複製されていることです。s.descriptionq.description

たとえば、次のような結果行がある場合:

[1, "Section A", 1, "Question A", 1, 1, "Answer A", 2, 2, 2]

Object[]Hibernateは、次のようなその行に対して誤ったものを返します。

[1, "Answer A", 1, "Answer A", 1, 1, "Answer A", 2, 2, 2]

最初は、これらの列はすべて同じ名前であるため、エイリアスを使用する必要があると思いましたが、上記のコードからわかるようにa.description、エイリアスはありません。この理由は、3つの列すべてにエイリアスを追加すると、列「description」が見つからないというsqlexceptionが発生するためです。私は完全に困惑しています、それはまるでコードが私をからかっていたかのようです。

さらに奇妙なことに、生成されたSQLクエリをコンソールから取得し、MySQLで実行すると、正常に機能します。なんらかのタイプミスがあるのではないかと思いますが、このコードをずっと見ていて、もう何も見えません。

4

1 に答える 1

2

addScalarすべてのクエリ予測にこのメソッドを使用する必要があります。例えば、

  Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString.toString())
    .addScalar("sectionDescription", StandardBasicTypes.STRING)
    .addScalar("questionDescription", StandardBasicTypes.STRING)
    .setInteger("idSurvey", idSurvey);
于 2013-01-09T21:35:50.980 に答える