Grails在很多方面寻找父母

时间:2010-06-29 05:16:58

标签: grails dynamic one-to-many finder

我的问题应该是显而易见的,但我现在看不到光: - (

我有两个这样的域类:

class Parent {
  String name
  static hasMany = [children: Child]
}

class Child {
  String name
}

现在我应该能够通过使用Parent的动态查找器找到孩子的父母:

Parent.findByChildren([someChild] as Set)

但我收到一个hibernate错误,指出我的hibernate SQL中出现了语法错误:

Caused by: java.sql.SQLException: No value specified for parameter 1

参考:someChild是一个具体的例子。我想避免Child在定义中有一个明确的父级。

我怎样才能从孩子到父母?

最诚挚的问候,

Christian Sonne Jensen

4 个答案:

答案 0 :(得分:3)

为了结束这个问题,我想报告一个解决我的“问题”的方法。我正在父实体(Customer或Producer)中使用namedQuery,如下所示:

Class Customer {

  static hasMany = [channels: Channel]

  static namedQueries = {
   findByChannel {
        channelId ->
          channels {
              eq 'id', channelId
      }
    }
  }
}

然后我发现客户是这样的:

def customers = Customer.findByChannel(channel.id).list()

通过这种方式,频道免除了了解谁引用它的负担,而且我不必做任何人工关系表。

我仍然认为一定是某种错误,我不能使用其中一个动态查找器:

Customer.findByChannels([channel] as Set)

也许动态查找器不考虑一对多关系,只适用于简单属性??? (我正在使用Grails 1.3.1)

感谢您的回复!

Christian Sonne Jensen

答案 1 :(得分:1)

如果您不想在子项上使用父外键,则必须为父项创建一个连接表,作为子项的代理项:

class ParentalRelationship { 
    static belongsTo = [parent: Parent, child: Child]
}

然后,您可以在父级上使用辅助方法通过ParentalRelationship对象查询子级。

通过真实实施客户,渠道和制作人,您可能需要多对多关系,因为渠道不属于单个客户(或单个制作人)。

答案 2 :(得分:1)

也许更好的方法是在chield belongsTo写下这样的内容:

static belongsTo = [parent: Parent]

然后你可以使用:

Chield c = ...
Parent parent = c.parent

答案 3 :(得分:0)

我会反驳它:

class Parent {
  String name

  static Set<Child> getChildren() {
    Child.findAllByParent(this) as Set
  }
}

class Child {
  String name
  Parent parent
}

它使用相同的数据库结构(子表具有父键的外键),但是可以很容易地从一侧转到另一侧而不是显式双向。

有一件事情确实发生了变化。而不是:

def parent = ...
parent.addToChildren(new Child(...))
parent.save()

你这样做:

def parent = ...
def child = new Child(parent: parent, ...).save()

这是更高效的,因为您不需要加载整个集合只是为了坚持一个新的孩子。