如何查询Grails中的多对多关系?

时间:2016-07-26 15:59:34

标签: hibernate grails gorm grails-3.1

我有以下域类:

class PreparedToWork {

    String location        
    static hasMany = [assessors: Assessor]        
}

class Assessor {

    //Some Properties

    static belongsTo = [PreparedToWork]     
    static hasMany = [preparedToWork: PreparedToWork]
}

我想检索准备在某个位置工作的所有评估员,只准备工作ID。我在实际的数据库中有我的连接表,所以我确定这种关系很好但是已经尝试了各种查询选项并且失败了。

应用信息:

  • Grails版本:3.1.8
  • Groovy版本:2.4.6
  • JVM版本:1.8.0_60

3 个答案:

答案 0 :(得分:2)

我认为以下是描述您的域名的更自然的方法

class Location {

    String name        
    static hasMany = [preparedToWork: Assessor]        
}

class Assessor {    
    //Some Properties

    static belongsTo = [Location]     
    static hasMany = [preparedToWork: Location]
}

然后,您可以使用

检索准备在某个位置工作的所有评估员
Assessor.executeQuery(
    "from Assessor a join a.preparedToWork l where l.id = ?", [locationId])

答案 1 :(得分:0)

我会设置我的域名与您拥有的域名略有不同。这是一个例子。

class Location{
   String name

   static hasMany = [assessors: Assessor]

   static  mapping = {
        assessors joinTable: [name: 'preparedToWork', key:'location_id']
   }
} 

class Assessor {    
    static belongsTo = [Location]  

    static hasMany = [locations: Location]

    static  mapping = {
        assessors joinTable: [name: 'preparedToWork', key:'assessor_id']
    }
} 

一旦域设置如此,我希望看到3个表 地点 估税员 preparedToWork:location_id和assessor_id的复合键

如果我需要找到特定地点的所有评估员,我可以使用以下声明。

def location = Location.where{ name == "some-location" }
def assessors = location.assessors // 

希望这会有所帮助。

答案 2 :(得分:0)

在尝试了许多不同类型的查询后,我使用了一个分离的查询。我确实尝试过解决方案1但是我也在查询许多其他属性,下面的查询允许我这样做。

def criteria = new DetachedCriteria(Assessor)
if (preparedToWork) {
  criteria = criteria.build {
    createAlias("preparedToWork", "p")
    eq("p.id", preparedToWork)
  }
}

criteria.list()