2013-01-09 79 views
2

Hibernate的環境中執行以下原生SQL查詢,當我遇到一些奇怪的問題:休眠:本地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(); 
} 

如果你看一下正在返回的屬性,你」我們會注意到三個不同的表中有三個description字段。我遇到的問題是列a.description的值在應該對應於s.descriptionq.description的陣列位置中被重複。

舉例來說,如果我有一個結果行如:

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

的Hibernate會返回一個不正確的Object[]該行如:

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

起初我還以爲我需要使用別名,因爲所有這些列都具有相同的名稱,但是從上面的代碼可以看出,a.description沒有別名。原因是,如果我爲所有三列添加一個別名,我會得到一個sqlexception,其中讀取列「description」未找到。我完全被難住了,就好像代碼嘲笑我一樣。

即使是更大,如果我從控制檯生成的SQL查詢並在MySQL上運行它工作正常。我懷疑我可能有某種錯字,但我一直在查看這段代碼很長時間以至於我再也看不到任何東西。

+0

請注意:使用+連接查詢的各個部分會更具可讀性,並且效率更高。 –

回答

2

對於所有查詢投影,您應該使用addScalar方法。例如,

Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString.toString()) 
    .addScalar("sectionDescription", StandardBasicTypes.STRING) 
    .addScalar("questionDescription", StandardBasicTypes.STRING) 
    .setInteger("idSurvey", idSurvey); 
+0

謝謝,我正在測試這個,但由於某種原因,我找不到對StandardBasicTypes的引用。你知道這是哪個罐子還是另一種設置這種類型的方法? – JayPea

+0

'org.hibernate.type.StandardBasicTypes'。它在覈心jar文件'hibernate-core-4.1.9.Final.jar'中。也許你正在使用一個非常舊的版本? – david

+0

我正在使用版本3.我會尋找該版本的等價物。謝謝。 – JayPea