【问题标题】:Query Subset of Columns with Gorm使用 Gorm 查询列的子集
【发布时间】:2026-01-27 00:10:02
【问题描述】:

假设我有以下域类:

class Book {
  String title
  String author
  byte[] largeCoverArtImage
}

我有一个不需要显示 largeCoverArtImage 的列表视图,如何使用 GORM Criteria 执行以下 SQL 查询?

select title, author from Book

【问题讨论】:

    标签: hibernate grails grails-orm hibernate-criteria


    【解决方案1】:

    您可以运行 HQL 查询,使用 executeQuery 选择单个列:

    def titlesAndAuthors = Book.executeQuery('select title, author from Book')
    

    这将返回一个 Object[] 列表,例如

    for (row in titlesAndAuthors) {
       String title = row[0]
       String author = row[1]
       ...
    }
    

    【讨论】:

    • 不是我希望的答案,因为我不能将标准的 Criteria 分页模式与 executeQuery 一起使用。但标记为已接受的答案(即“否”)。我会指出,一个适用于 Criteria 的解决方案是专门为列表页面创建一个数据库视图和单独的域类(假设是遗留数据库)(从而轻松利用 Criteria 分页模式)。当然,缺点是你有两个不兼容的类,它们代表了本质上相同的记录集。
    【解决方案2】:

    在 Grails(使用 1.3.7 版本测试)中,您可以编写:

    def titlesAndAuthors = Book.withCriteria {
            projections {
                property 'title', 'title'
                property 'author', 'author'
            }
    }
    

    你会得到一个像上面例子一样的 Object[] 列表。

    【讨论】:

    • 酷 - 很高兴知道,我们现在正在运行 grails 1.3.2,并且处于维护模式,但是如果我有机会升级并尝试一下,我会回来让你知道结果如何。
    • 快进:我现在在一个使用 Grails 2.0.3 的项目中,效果很好!
    • 有没有办法获取 Object{} 列表而不是 Object[] 列表?使用“projections”会破坏我的 api,因为我依赖于对象列表。它确实检索了 Object[] 的列表。感谢您的建议。