Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Grails createCriteria在hasMany上按条件排序_Hibernate_Sorting_Grails_Criteria - Fatal编程技术网

Hibernate Grails createCriteria在hasMany上按条件排序

Hibernate Grails createCriteria在hasMany上按条件排序,hibernate,sorting,grails,criteria,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类对资产的查询

我尝试按hasMany的特定条目对createCriteria查询排序。我的域名看起来像:

class Asset {

  String name
  static hasMany = [
    supporters: SupportRole
  ]
}

class SupportRole {
  Asset asset
  Person person
  String role
}

class Person {
  String name
}
我要做的是按照Person类对资产的查询排序,其中role='Primary'。如何基于条件进行连接?我提出了以下查询,但它无法正常工作:

assets = Asset.createCriteria.list() {
  supporters {
    like('role', 'Primary')
    person {
      order('name', sortOrder)
    }
  }
}
但是这个查询没有识别联接表的“role”属性,它只是消除了没有“Primary”SupportRole的资产。我需要它能够处理空值(例如,给定资产没有“主要”SupportRole)


万分感谢

标准可以很容易地转换为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'])

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

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

谢谢你的帮助。然而,这是一个更大的查询的一部分,该查询基于一个变量进行排序(使用jqGrid)。我仍然需要使用变量使用能力的标准。有没有办法将此HQL嵌入到标准中?标准在运行时会转换为HQL,然后执行。当您说“将HQL嵌入Critera”时,它没有意义。更大的查询也可以用HQL编写,在使用关联的地方使用更多的内部联接。如果您想深入了解HQL,请访问并查看@user1505503您仍然可以通过executeQuery传递变量。例如,如果jqGrid正在发送订单,只需将其替换为“desc”