Hibernate 如何向grails标准添加标准以限制基于过滤关联的结果?

Hibernate 如何向grails标准添加标准以限制基于过滤关联的结果?,hibernate,grails,gorm,criteria-api,Hibernate,Grails,Gorm,Criteria Api,在我的旧java代码中,我可以这样做,在hibernate查询中“连接”另一个表,并基于它过滤结果 final Criteria brokerageCriteria = userCriteria.createCriteria("brokerage"); if (queryDto.getBrokerageID() != null) { brokerageCriteria.add(Restrictions.eq("id", queryDto.

在我的旧java代码中,我可以这样做,在hibernate查询中“连接”另一个表,并基于它过滤结果

 final Criteria brokerageCriteria = userCriteria.createCriteria("brokerage");
            if (queryDto.getBrokerageID() != null) {
                brokerageCriteria.add(Restrictions.eq("id", queryDto.getBrokerageID()));
            }
在本例中,它将过滤仅为特定经纪公司成员的用户(每个用户有一个经纪公司)


如您所见,我可以通过调用criteria.createCriteria(String associationName)轻松地连接hibernate映射中关联的其他表。grails中有类似的东西吗?我正在尝试构建一个通用的JSON-to-criteria web api,供我们的内部开发人员搜索各种表格、页面数据等。

考虑到这个场景,下面是
类和
条件
查询

//Domain User
class User{
    //each user has one brokerage
    static hasOne = [brokerage: Brokerage]
}

//Domain Brokerage
class Brokerage{
    //Optional
    //static belongsTo = [user: User]
}

//Criteria Query
def user = User.createCriteria().get{
    brokerage{
       idEq(queryDto.getBrokerageID())
    }
}
或者您也可以使用非DSL方式

def user = User.createCriteria().get{
       eq('brokerage.id', queryDto.getBrokerageID())
}
在grails中使用
条件时,连接关联表更容易,因为它使用dsl(领域特定语言)。在上面的示例中,仅通过在标准中提供关联作为
brokerage{}
User
brokerage
上基于
brokerageId
进行内部联接

grails中
条件的美妙之处在于,您可以动态处理查询。例如,如果一个
用户
有一个
经纪人
和一个
抵押贷款
和多个
留置权
,并且如果JSON中提供了
经纪人ID
抵押ID
,您希望从系统中获得一个
用户
。上述标准可根据需要有效提高

def user = User.createCriteria().get{
      if(queryDto.getBrokerageID() != null){
          brokerage{
             idEq(queryDto.getBrokerageID())
          }
      } else if(queryDto.getMortgageID() != null){
          mortgage{
             idEq(queryDto.getMortgageID())
          }
      } else if(queryDto.getLienID() != null){
          liens{
             idEq(queryDto.getLienID())
          }
      }
   }
用户
域看起来像

class User{
        //each user has one brokerage and one mortgage
        static hasOne = [brokerage: Brokerage, mortgage: Mortgage]
        static hasMany = [liens: Lien] //many Liens
    }