在HQL中指定字段列表似乎不起作用

时间:2012-08-12 16:14:39

标签: spring hibernate jsp oracle10g hql

我在使用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中指定字段列表?

2 个答案:

答案 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知道哪个实体是我引用的属性,我暗示所有这些属性都来自同一个实体,如果没有,那么请检查你的引用!