我具有以下域类
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
执行这种过滤?
答案 0 :(得分:0)
您可以通过直接查询Event
类来完成此操作。这样,您可以专门查询您关心的Event
的风格。然后使用ID的列表查询Offer
表
Offer.findAllByIdInList(EventC.list().offerId)
答案 1 :(得分:0)
这实际上比我预期的要容易。根据我的搜索条件,我可以构建一个不包含具有事件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 <> ?
)