Hibernate 如何向grails标准添加标准以限制基于过滤关联的结果?
在我的旧java代码中,我可以这样做,在hibernate查询中“连接”另一个表,并基于它过滤结果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.
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
}