嵌套hasOne实体的GORM查询条件

时间:2016-03-25 17:50:02

标签: grails gorm

我试图通过子实体的属性创建GORM条件查询过滤。所以有这样的实体:

postsFromFollowedUsersQuery.whereMatchesKeyInQuery(kPAPPhotoUserKey , kPAPActivityToUserKey , followingActivitiesQuery);

现在我尝试选择具有特定类别的PaymentEntries。我正在尝试这样的事情:

class PaymentEntry {

  static hasOne = [category: PaymentCategory]

  static constraints = {
    category(nullable: true)
  }

  // other stuff
}

class PaymentCategory {

  static hasMany = [payments: PaymentEntry]

  // other stuff  
}

def c = PaymentEntry.createCriteria() def res = c { 'in'("category", categories) } 此处列出了之前选择的categories个实体。

不幸的是,这失败了。 Grails抛出NoSuchMethodException。

2 个答案:

答案 0 :(得分:1)

你应该有inList。 试试这个:

def res = c {
  inList("category", categories)
}

答案 1 :(得分:0)

有很多问题。 hasOne用于一对一associations,但实际上您只有一对多。所以第一步是修复关联,可能是这样的:

class PaymentEntry {

  static belongsTo = [category: PaymentCategory]

  static constraints = {
    category(nullable: true)
  }

  // other stuff
}

class PaymentCategory {

  static hasMany = [payments: PaymentEntry]

  // other stuff  
}

接下来,一旦有了条件实例,就需要调用其中一个方法(例如list())来构建和执行查询。

def c = PaymentEntry.createCriteria()

def res = c.list {
  'in'("category", categories)
}  

相同的更短版本是......

def res = PaymentEntry.withCriteria {
  'in'("category", categories)
}  

只要您引用in(),就可以使用inList()in,因为它是一个Groovy关键字。您可以阅读有关条件查询here的更多信息。