【问题标题】:Querying computed fields in GORM在 GORM 中查询计算字段
【发布时间】:2011-01-02 06:09:58
【问题描述】:

我正在尝试使用 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! 理想情况下,我想使用一个通用的 executeQuery,它将返回任何类型的数据。有这种事吗?

【问题讨论】:

    标签: hibernate grails groovy hql grails-orm


    【解决方案1】:

    我正在回答我自己的问题。这样做的唯一方法是执行原始 SQL 而不是使用 HQL。不幸的是,我无法弄清楚如何使用子查询和计算字段来执行复杂的查询。

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

    【讨论】:

      【解决方案2】:

      您也可以使用标准生成器解决此问题。 Using groupProperty and countDistinct in Grails Criteria

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

      首先你必须创建子查询:

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

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

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

      【讨论】:

      • 您列出的示例是从一个表(事务表)查询。在上面的查询中,我查询的是子查询而不是表。您可以在 grails 中为此编写标准吗?我简化了上面的查询,在我的真实应用程序中查询更复杂,并且有两个嵌套的子查询。
      【解决方案3】:

      不清楚 - 您希望获得什么数据类型?

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

      看起来您希望获得带有额外countToId 字段的MailMessage-s 集合。这不是直接可行的方法,除非您可以将虚拟字段添加到 MailMessage 并为其编写“选择”表达式。

      【讨论】:

      • count(XXX) 应该返回数字字段。
      • :D 您期望 Groovy 中的整个数据集类型是什么? Collection<MailMessage>Collection<Collection<Object>>?
      • [[]] 是我所期待的,但我会接受 [[:]]。例如:[[1223, 5], [14455,3], [1111, 4]]。每个子数组都是结果集中的一行。
      • 如果写完整的语句,以select开头,会返回List,试试看。
      猜你喜欢
      • 2012-03-08
      • 2021-04-07
      • 2017-04-28
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多