我在使用Spring MVC的Hibernate中有以下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中指定字段列表?
答案 0 :(得分: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 :(得分:1)
为什么不尝试制作地图?像这样:
SELECT NEW MAP( colour.colourId AS id
, colour.colourName AS name ...)
FROM Colour colour
ORDER BY colour.colourId
我使用Color“color”的别名,所以hibernate知道哪个实体是我引用的属性,我暗示所有这些属性都来自同一个实体,如果没有,那么请检查你的引用!