0

我在使用 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();

但不幸的是,它也对我不起作用。使用该方法执行本机 SQL 会起作用,但除非绝对必要,否则createSQLQuery()我想坚持使用 HQL 的方法。createQuery()如何在 HQL 中指定字段列表?

4

2 回答 2

2

我同意约克的评论。如果您在查询中选择属性,那么您不能要求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
    }
于 2012-08-13T22:20:18.203 回答
1

为什么不尝试创建地图?像这样的东西:

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

我使用颜色“颜色”的别名,因此休眠知道我引用的属性来自哪个实体,我暗示所有这些属性都来自同一个实体,如果不是,请检查您的引用!

于 2012-08-12T16:48:11.077 回答