我有两个具有许多映射的域类。
一堂课:
class Line {
static belongsTo = [header : Header]
Long invoiceId
Long lineNumber
Long oneId
Long secondId
Long thirdId
static mapping = {
table('LINES_2_V')
version(false)
id composite: ['invoiceId', 'lineNumber']
}
}
另一堂课:
class Header {
static hasMany = [lines: Line]
Long id
static mapping = {
table('HEADERS_2_V')
version(false)
id column:'INVOICE_ID'
}
}
Createria:
Header.createCriteria().list() {
createAlias('Lines', 'l', CriteriaSpecification.INNER_JOIN)
if (oneId) {
eq('l.oneId', oneId)
} else {
isNull('l.oneId')
}
if (secondId) {
eq('l.secondId', secondId)
}else {
isNull('l.secondId')
}
if (thirdId) {
eq('l.thirdId', thirdId)
}else {
isNull('l.thirdId')
}
}
我得到以下错误:
ORA-00904: "L1_"."HEADER_ID": invalid identifier
Hibernate生成的select看起来像这样:
Hibernate: select * from ( select this_.INVOICE_ID as INVOICE1_0_1_
from HEADERS_2_V this_,
LINES_2_V ihl1_ where this_.INVOICE_ID=l1_.header_id and ihl1_.project_id is null
and ihl1_.transaction_id is null and ihl1_.po_header_id is null ) where rownum <= ?
为什么它试图按HEADER_ID
进行映射?如何按INVOICE_ID
进行映射?
答案 0 :(得分:3)
因为这是您对Line表中存储的Header的后引用。你的表是这样的:
Lines_2_V:invoice_id,line_number, header_id ,one_id,second_id,thid_id
Header_2_V:invoice_id
由于Gorm已经将Header的id
存储在Line表中,因此使用它来加入它们。
当您将belongTo
作为地图时:
static belongsTo = [header : Header]
Grails / Gorm会在你的表格中创建一个后向引用。您也可以使用
static belongsTo = Header
哪个gorm创建中间表来加入它们 有关更多信息,请参阅Peter Ledbrook
中的GORM Gotchas文章 btw,Lines
应为lines
:
createAlias('Lines', 'l', CriteriaSpecification.INNER_JOIN)
应该是
createAlias('lines', 'l', CriteriaSpecification.INNER_JOIN)