Grails/Gorm - namedQuery 有很多关系
Grails/Gorm - namedQuery hasMany relationship
我有以下域名类
class EventA {
static belongsTo = [offer: Offer]
}
class EventB extends EventA {}
class EventC extends EventA {}
class Offer {
static hasMany [events: EventA]
}
我需要检索与 EventC
无关的报价。
在 SQL 中,这可以很容易地执行为:
SELECT *
FROM OFFER O
LEFT JOIN EVENTC C ON O.event_id = C.id
WHERE C.ID IS NULL
通过搜索我发现的 grails 文档 instanceOf。说明一旦你有了结果集,你就可以检查实例类型。
def offers = Offer.list()
for (Offer o in offers) {
for(Event e : o.events) {
if (e.instanceOf(EventC)) {
// no bueno
}
}
}
以上感觉不对。我更愿意让数据库为我做这样的过滤。有没有办法用 searchCriteria
执行这样的过滤器?
您可以通过直接查询 Event
类 来完成此操作。这样你就可以具体查询你关心的 Event
的风味。然后用 Id 的列表
查询 Offer
table
Offer.findAllByIdInList(EventC.list().offerId)
这实际上比我预期的要容易。根据我的搜索条件,我可以构建一个表达式以不包含任何具有事件 EventC
.
的报价
示例:
Offer.with {
events {
ne('class', EventC)
}
}
由于我质疑这种方法,所以我启用了休眠日志记录。具有讽刺意味的是,它生成的 SQL 与我想要的非常相似。
SELECT *
FROM OFFER O
LEFT JOIN EVENTB B ON O.ID == B.EVENT_ID
LEFT JOIN EVENTC C ON O.ID == C.EVENT_ID
WHERE
(
CASE
WHEN B.ID IS NOT NULL THEN 1
WHEN C.ID IS NOT NULL THEN 2
END <> ?
)
我有以下域名类
class EventA {
static belongsTo = [offer: Offer]
}
class EventB extends EventA {}
class EventC extends EventA {}
class Offer {
static hasMany [events: EventA]
}
我需要检索与 EventC
无关的报价。
在 SQL 中,这可以很容易地执行为:
SELECT *
FROM OFFER O
LEFT JOIN EVENTC C ON O.event_id = C.id
WHERE C.ID IS NULL
通过搜索我发现的 grails 文档 instanceOf。说明一旦你有了结果集,你就可以检查实例类型。
def offers = Offer.list()
for (Offer o in offers) {
for(Event e : o.events) {
if (e.instanceOf(EventC)) {
// no bueno
}
}
}
以上感觉不对。我更愿意让数据库为我做这样的过滤。有没有办法用 searchCriteria
执行这样的过滤器?
您可以通过直接查询 Event
类 来完成此操作。这样你就可以具体查询你关心的 Event
的风味。然后用 Id 的列表
Offer
table
Offer.findAllByIdInList(EventC.list().offerId)
这实际上比我预期的要容易。根据我的搜索条件,我可以构建一个表达式以不包含任何具有事件 EventC
.
示例:
Offer.with {
events {
ne('class', EventC)
}
}
由于我质疑这种方法,所以我启用了休眠日志记录。具有讽刺意味的是,它生成的 SQL 与我想要的非常相似。
SELECT *
FROM OFFER O
LEFT JOIN EVENTB B ON O.ID == B.EVENT_ID
LEFT JOIN EVENTC C ON O.ID == C.EVENT_ID
WHERE
(
CASE
WHEN B.ID IS NOT NULL THEN 1
WHEN C.ID IS NOT NULL THEN 2
END <> ?
)