如何向grails标准添加条件以根据过滤的关联限制结果?

时间:2013-05-09 00:19:51

标签: hibernate grails gorm criteria-api

在我的旧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来搜索各种表,页面数据等。

1 个答案:

答案 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{}中提供关联,才会根据UserBrokeragebrokerageId上完成内部联接。

grails中Criteria的美妙之处在于您可以动态处理您的查询。例如,如果User有一个Brokerage,一个Mortgage和多个Lien,并且您希望从系统获得User,如果有的话JSON中提供了brokerageIdmortgageIdlienId

可以有效地提高上述标准
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
    }