Grails / Gorm-namedQuery hasMany关系

时间:2019-06-19 17:53:40

标签: grails gorm grails-2.0

我具有以下域类

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执行这种过滤?

2 个答案:

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