【问题标题】:Grails/Gorm - namedQuery hasMany relationshipGrails/Gorm - namedQuery hasMany 关系
【发布时间】:2019-06-19 17:53:40
【问题描述】:

我有以下域类

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

搜索我发现instanceOf 的grails 文档。说明一旦获得结果集,您就可以检查实例类型。

    def offers = Offer.list()
    for (Offer o in offers) {
       for(Event e : o.events) {
          if (e.instanceOf(EventC)) {
              // no bueno
          }
       }
    }

以上只是感觉不对。我宁愿让数据库为我做这样的过滤。有没有办法用searchCriteria 执行这样的过滤器?

【问题讨论】:

    标签: grails grails-orm grails-2.0


    【解决方案1】:

    您可以通过直接查询Event 类来完成此操作。这样你就可以专门查询你关心的Event的味道。然后用Id的列表查询Offer

    Offer.findAllByIdInList(EventC.list().offerId)
    

    【讨论】:

    • 我对这种方法唯一关心的是我只需要删除几个事件之一。这将需要构建所有事件中所有 ID 的列表。在生产数据库中,这将是巨大的。
    • 如果你知道Offer ID,你可以EventC.findAllByOfferId(12345).delete()
    【解决方案2】:

    这实际上比我预期的要容易。根据我的搜索条件,我可以构建一个表达式以不包含任何具有事件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 <> ?
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多