1

在我的旧 java 代码中,我可以这样做以在休眠查询中“加入”另一个表并基于它过滤结果。

 final Criteria brokerageCriteria = userCriteria.createCriteria("brokerage");
            if (queryDto.getBrokerageID() != null) {
                brokerageCriteria.add(Restrictions.eq("id", queryDto.getBrokerageID()));
            }

在此示例中,它将仅过滤属于特定经纪商的用户(每个用户都有一个经纪商)。

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

4

1 回答 1

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())
}

criteria在 grails中更容易连接关联的表,因为它使用 DSL(领域特定语言)。在上面的示例中,仅通过在条件中提供关联作为brokerage{}INNER JOIN 才能在UserBrokerage基于 上完成brokerageId

in grails的美妙之Criteria处在于您可以动态地处理您的查询。例如,如果 aUser有 oneBrokerage和 oneMortgage和 many ,并且如果JSON 中提供了, ,中的任何Lien一个,您想从系统中获取 an 。上述标准可以有效地提高为UserbrokerageIdmortgageIdlienId

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
    }
于 2013-05-09T00:43:10.623 回答