Grails通过多方查找父对象

Grails通过多方查找父对象,grails,dynamic,one-to-many,finder,Grails,Dynamic,One To Many,Finder,我的问题应该是显而易见的,但我现在看不到曙光:-( 我有两个类似这样的DomainClass: class Parent { String name static hasMany = [children: Child] } class Child { String name } static belongsTo = [parent: Parent] 现在,我应该能够通过使用动态父对象查找器查找子对象的父对象,如: Parent.findByChildren([someChild

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

我有两个类似这样的DomainClass:

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

class Child {
  String name
}
static belongsTo = [parent: 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

我想把它颠倒过来:

class Parent {
  String name

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

class Child {
  String name
  Parent parent
}
您可以这样做:

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

这更有效,因为您不需要加载整个集合就可以持久化一个新的子项。

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

class ParentalRelationship { 
    static belongsTo = [parent: Parent, child: Child]
}
然后,可以在父对象上使用helper方法通过ParentalRelationship对象查询子对象


随着您对客户、渠道和制作人的真正实施,您可能希望建立多对多关系,因为渠道不属于单个客户(或单个制作人)。

为了结束这个问题,我想报告我的“问题”的解决方案。我在父实体中使用namedQuery(客户或生产商)如下所示:

Class Customer {

  static hasMany = [channels: Channel]

  static namedQueries = {
   findByChannel {
        channelId ->
          channels {
              eq 'id', channelId
      }
    }
  }
}
def customers = Customer.findByChannel(channel.id).list()
然后我发现客户是这样的:

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)
也许动态查找程序没有考虑一对多关系,只适用于简单属性??(我使用的是Grails1.3.1)

谢谢你的回复


Christian Sonne Jensen

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

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

class Child {
  String name
}
static belongsTo = [parent: Parent]
然后您可以使用:

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

是的,我是这么想的,但我想避免孩子知道自己的父母。在我的真实案例中,我有一个客户和一个频道作为父母和孩子。客户有一个频道列表,但频道也可以由制作人映射。因此频道不应该知道客户(或制作人),因为这会使通道不那么通用。通常情况下,表被其他实体映射,而表却不知道。我只需要知道从子(通道)到af父(客户/生产商/任何东西)的语法Best RegardsGrails管理多对多关系,还自动创建联接表。