使用带参数的 GORM 在一对一 Grails 域上加入查询
join query on one-to-one Grails domain using GORM with parameters
我有两个 Grails domain
class,比方说:
class Hero {
String name
Float level
Familiar familiar
}
class Familiar {
String name
Integer raceId
}
现在,我想要的是检索所有具有 Familiar
且名称与给定 String
相似的 Hero
,例如 :"hachiko"
。要使用 SQL
做到这一点,我只需要执行与此类似的查询:
SELECT h.name, h.level
FROM HERO h JOIN FAMILIAR f ON h.id = f.ownerId
WHERE f.name LIKE '%hachiko%'
但是我怎样才能在 Grails
上做到这一点?这是我的代码:
String filter = "hachiko"
def hero = Hero.executeQuery(
"SELECT h.name, h.level FROM HERO h JOIN h.familiar WHERE h.id = " +
"h.familiar.ownerId and h.familiar.name LIKE :filter",
[filter, "%$filter%"]
)
这行得通吗?我是否应该创建那些 static
属性(hasOne
、belongsTo
),我应该将它们放在哪里?因为到目前为止,没有那些 static
属性,我收到一条 error
消息:
ORA-00904: "HERO0_"."FAMILIAR_ID": invalid identifier
添加了 static
属性后,我得到了这个:
org.hibernate.MappingException: hasOne property [Hero.familiar] is not bidirectional. Specify the other side of the relationship!
他们的关系是可选的一对一。 (例如,一个 Hero
最多可以有一个 Familiar
),而 Familiar
的 id
与 Hero
相同。
你可以使用 createCriteria
String filter = "hachiko"
def hero = Hero.createCriteria().list {
familiar {
like('name', filter)
}
}
我有两个 Grails domain
class,比方说:
class Hero {
String name
Float level
Familiar familiar
}
class Familiar {
String name
Integer raceId
}
现在,我想要的是检索所有具有 Familiar
且名称与给定 String
相似的 Hero
,例如 :"hachiko"
。要使用 SQL
做到这一点,我只需要执行与此类似的查询:
SELECT h.name, h.level
FROM HERO h JOIN FAMILIAR f ON h.id = f.ownerId
WHERE f.name LIKE '%hachiko%'
但是我怎样才能在 Grails
上做到这一点?这是我的代码:
String filter = "hachiko"
def hero = Hero.executeQuery(
"SELECT h.name, h.level FROM HERO h JOIN h.familiar WHERE h.id = " +
"h.familiar.ownerId and h.familiar.name LIKE :filter",
[filter, "%$filter%"]
)
这行得通吗?我是否应该创建那些 static
属性(hasOne
、belongsTo
),我应该将它们放在哪里?因为到目前为止,没有那些 static
属性,我收到一条 error
消息:
ORA-00904: "HERO0_"."FAMILIAR_ID": invalid identifier
添加了 static
属性后,我得到了这个:
org.hibernate.MappingException: hasOne property [Hero.familiar] is not bidirectional. Specify the other side of the relationship!
他们的关系是可选的一对一。 (例如,一个 Hero
最多可以有一个 Familiar
),而 Familiar
的 id
与 Hero
相同。
你可以使用 createCriteria
String filter = "hachiko"
def hero = Hero.createCriteria().list {
familiar {
like('name', filter)
}
}