【问题标题】:Grails createCriteria order by condition on hasManyGrails createCriteria order by condition on hasMany
【发布时间】:2013-08-04 07:23:42
【问题描述】:

我正在尝试通过 hasMany 的特定条目对我的 createCriteria 查询进行排序。我的域名如下所示:

class Asset {

  String name
  static hasMany = [
    supporters: SupportRole
  ]
}

class SupportRole {
  Asset asset
  Person person
  String role
}

class Person {
  String name
}

我想要做的是按角色 ='Primary' 的 Person 类对我的资产查询进行排序。如何根据条件进行连接?我想出了以下查询,但它不能正常工作:

assets = Asset.createCriteria.list() {
  supporters {
    like('role', 'Primary')
    person {
      order('name', sortOrder)
    }
  }
}

但是这个查询没有识别连接表的“角色”属性,它只是消除了没有“主要”支持角色的资产。我需要它能够处理空值(例如,给定资产没有“主要”支持角色)。

谢谢一百万!

【问题讨论】:

    标签: hibernate sorting grails criteria


    【解决方案1】:

    在这些情况下使用 hql 很好,但如果您仍然想坚持标准,那么您应该在查询中明确定义 null 条件。现在让我们省略“order by”,查询应该是这样的:

    assets = Asset.createCriteria.list() {
    or{
      supporters {
      like('role', 'Primary')
      }
    isEmpty("supporters")
    }
    }
    

    【讨论】:

      【解决方案2】:

      标准可以很容易地转换为 HQL,如下所示,无需处理投影和别名。

      def assets = Asset.executeQuery("select a from Asset as a \
                                       inner join a.supporters as s \
                                       inner join s.person as p \
                                       where s.role = 'Primary' \ 
                                       order by p.name = :sortOrder",
                                       [sortOrder: 'desc'])
      

      【讨论】:

      • 感谢您的帮助。但是,这是基于变量(使用 jqGrid)排序的更大查询的一部分。我仍然需要为使用变量的能力使用标准。有没有办法将此 HQL 嵌入到标准中?
      • 条件在运行时被转换为 HQL 然后执行。当您说“将 HQL 嵌入 Critera”时,它没有意义。您更大的查询也可以用 HQL 编写,并在使用关联的地方添加更多内部连接。如果您想深入了解 HQL,请访问 here 并查看 usage in grails。 @user1505503
      • 您仍然可以通过 executeQuery 传递变量。例如,如果您的 jqGrid 正在发送订单,只需输入它而不是 'desc'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多