我有一个遗留数据库,我用它来映射grails 2.2.1应用程序中的域对象。
我正在使用的表包含了FK关系,它为孩子们提供了回归。幸运的是,我知道我只需要在层次结构中深入一层。
T_FOO
----------------------
I LONG
CHILD_FOO LONG
这是可能的结果集:
I CHILD_FOO
- ---------
1 NULL
2 NULL
3 1
4 1
5 2
我的域对象如下所示:
class Foo {
long instanceId
static hasMany = [childFoos: Foo]
static mapping {
table 'T_FOO'
id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long'
version false
autoTimestamp false
instanceId column: 'I'
// I tried joining the table to itself and it didn't work
childFoos joinTable [name: 'T_FOO', key: 'CHILD_FOO', column: 'I'
}
}
查询不起作用。 Hibernate将t0.class放入选择列表中,但它失败了。
有什么建议吗?
此致 罗宾
答案 0 :(得分:0)
这很麻烦,但我最后通过创建另一个包含对原始类的引用的域类来解决问题。我想找到一个更好的方法,但现在这将有效。
我正在测试的数据库表:
mysql> desc t_foo;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| I | bigint(20) | NO | PRI | NULL | |
| Description | varchar(45) | YES | | NULL | |
| I_CHILDFOO | bigint(20) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
mysql> select * from t_foo;
+---+--------------+------------+
| I | Description | I_CHILDFOO |
+---+--------------+------------+
| 1 | Parent 1 | NULL |
| 2 | Parent 2 | NULL |
| 3 | Child 1 of 1 | 1 |
| 4 | Child 1 of 1 | 1 |
| 5 | Child 1 of 2 | 2 |
+---+--------------+------------+
我的课程如下:
package db.legacy
class Foo {
long instanceId
String info
static hasMany = [ kids: ChildFoo ]
static constraints = {
}
static mapping = {
table 'T_FOO'
id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long'
version false
autoTimestamp false
instanceId column: 'I'
info column: 'Description'
kids column: 'I_CHILDFOO'
}
}
class ChildFoo {
long instanceId
Foo parentFoo
static mapping = {
table 'T_FOO'
id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long'
version false
autoTimestamp false
instanceId column: 'I'
parentFoo column: 'I_CHILDFOO'
}
}
当我进行以下测试时效果很好:
def foo = db.legacy.Foo.get(1)
foo.kids.each { bar ->
assert bar.parentFoo.instanceId == foo.instanceId
}
这看起来像是一个草率/ hacky解决方案。如果有人有任何想法或想法,我很乐意听到。
THX