查询GORM中的计算字段

时间:2011-01-02 06:09:59

标签: hibernate grails groovy hql gorm

我正在尝试使用GORM查询以下HQL:

MailMessage.executeQuery("toId, count(toId) from (SELECT  toId, threadId FROM MailMessage as m WHERE receiveStatus = 'u' GROUP BY threadId, toId) as x group by x.toId")

问题是count(toId)MailMessage中不存在的计算字段,而我正在使用子查询。

我收到以下错误:java.lang.IllegalArgumentException: node to traverse cannot be null!理想情况下,我想使用一个返回anytype数据的通用executeQuery。有这样的事吗?

3 个答案:

答案 0 :(得分:3)

我正在回答我自己的问题。执行此操作的唯一方法是执行原始SQL而不使用HQL。不幸的是,我无法找到如何使用子查询和计算字段执行复杂查询。

我在这里使用了示例:Grails query not using GORM

答案 1 :(得分:1)

您也可以使用条件构建器解决此问题。 Using groupProperty and countDistinct in Grails Criteria

伊迪丝: 好的,你必须将hibernate标准混合到标准构建器中。对于子查询,您必须使用org.hibernate.criterion.DetachedCriteria

首先,您必须创建子查询:

 DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight").avg() );

如果我是对的,你可以将它用于标准构建器:

Cat.withCriteria{
   and{Subqueries.geAll("weight", weights)}
}

答案 2 :(得分:0)

目前还不清楚 - 您希望获得哪种数据类型?

如果您只想要一个数据集 - 字段值列表列表,则需要使用完整的HQL“select”语法executeQuery has some examples of

看起来您希望获得MailMessage - s的集合,其中包含额外的countToId字段。除非您可以向MailMessage添加虚拟字段并为其写一个“选择”表达式,否则这不是直接的方式。