在我的旧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来搜索各种表,页面数据等。
答案 0 :(得分:2)
考虑到这种情况,这里是domain
类和criteria
查询
//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中criteria
的情况下,更容易加入关联表,因为它使用DSL(特定于域的语言)。在上面的示例中,只有通过在条件brokerage{}
中提供关联,才会根据User
在Brokerage
和brokerageId
上完成内部联接。
grails中Criteria
的美妙之处在于您可以动态处理您的查询。例如,如果User
有一个Brokerage
,一个Mortgage
和多个Lien
,并且您希望从系统获得User
,如果有的话JSON中提供了brokerageId
,mortgageId
,lienId
。
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())
}
}
}
User
域看起来像
class User{
//each user has one brokerage and one mortgage
static hasOne = [brokerage: Brokerage, mortgage: Mortgage]
static hasMany = [liens: Lien] //many Liens
}