2012-08-12 21 views
0

我在使用Spring MVC的Hibernate中擁有以下HQL。在HQL中指定字段列表似乎不起作用

List<Colour>list=session.createQuery("from Colour order by colourId desc") 
.setFirstResult((currentPage-1)*rowsPerPage) 
.setMaxResults(rowsPerPage).list(); 

它的工作原理,並返回從顏色表中的行Oracle 10g中的列表(實際上在顏色實體(POJO),我能理解工作)。

如果我需要檢索列表字段,我在嘗試以下操作。

List<Colour>list=session.createQuery("colourId, colourName, colourHex from Colour order by colourId desc") 
.setFirstResult((currentPage-1)*rowsPerPage) 
.setMaxResults(rowsPerPage).list(); 

它有錯誤時拋出

java.lang.IllegalArgumentException: node to traverse cannot be null! 

在一些文章,提到結束該HQL以下版本應該(或可以)工作

List<Colour>list=session.createQuery("select colourId, colourName, colourHex from Colour order by colourId desc") 
.setFirstResult((currentPage-1)*rowsPerPage) 
.setMaxResults(rowsPerPage).list(); 

但不幸的是,它也沒有爲我工作。使用createSQLQuery()方法來執行本機SQL可行,但我想堅持使用HQL的createQuery()方法,除非絕對必要。我如何在HQL中指定一個字段列表?

+1

嘗試'列表列表= session.createQuery(your_hql).LIST();' – yorkw 2012-08-13 04:51:16

回答

2

我同意yorkw的評論。如果您在查詢中選擇屬性,則不能要求List<Colour>對象從呼叫返回.list()

相反,你應該這樣做

List<Object[]> rows = session.createQuery("select c.colourId, c.colourName, c.colourHex " + 
     " from Colour c " + 
     " order by c.colourId desc").list(); 

然後遍歷列表對象和實例化對象。或者你需要做的任何事情。

for (Object[] row : rows) { 
     Long colourId = (Long)row[0]; 
     // ... etc 
    } 
1

你爲什麼不嘗試創建地圖?事情是這樣的:

SELECT NEW MAP(colour.colourId AS id 
       , colour.colourName AS name ...) 
    FROM Colour colour 
    ORDER BY colour.colourId 

我用彩「色彩」的別名,所以Hibernate知道從哪個實體是我參考,我意味着所有這些特性都來自同一實體,如果沒有,那麼檢查屬性你的參考!

+0

根據[此](http://docs.jboss.org/hibernate/core/3.6/reference/en -US/html/queryhql.html#queryhql-select)規範,這個查詢'選擇c.colourId,c.colourName,c.colourHex從Color c order by c.colourId desc'應該可以工作,但它不會。此外,[this](http://stackoverflow.com/a/10996261)和[this](http://stackoverflow.com/a/5484814)問題和相應的答案表明了同樣的事情。我不明白爲什麼它不適用於我的情況。 – Tiny 2012-08-12 17:35:23