Grails / Gorm - namedQuery имеет много отношений - PullRequest
0 голосов
/ 19 июня 2019

У меня есть следующие классы домена

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 голосов
/ 21 июня 2019

На самом деле все оказалось проще, чем я ожидал.По моим критериям поиска я могу построить выражение, которое не будет включать ни одного предложения, в котором есть событие 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 <> ?
  )
0 голосов
/ 20 июня 2019

Вы можете сделать это, обратившись к классам Event напрямую.Таким образом, вы можете специально запросить аромат Event, который вам небезразличен.Затем запросите таблицу Offer со списком идентификаторов

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