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 <> ?
  )