我的问题应该是显而易见的,但我现在看不到光: - (
我有两个这样的域类:
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
答案 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()
这是更高效的,因为您不需要加载整个集合只是为了坚持一个新的孩子。