在hasMany上按条件创建Grails createCriteria顺序

时间:2013-08-02 22:05:21

标签: hibernate sorting grails criteria

我尝试通过hasMany的特定条目来命令我的createCriteria查询。我的域名看起来像:

class Asset {

  String name
  static hasMany = [
    supporters: SupportRole
  ]
}

class SupportRole {
  Asset asset
  Person person
  String role
}

class Person {
  String name
}

我想要做的是按Person类查询Assets,其中role ='Primary'。你如何根据条件进行加入?我提出了以下查询,但它无法正常工作:

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

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

万分感谢!

2 个答案:

答案 0 :(得分: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'])

答案 1 :(得分:0)

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

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