2015-07-25 3 views
0

У меня есть этот домен 3 класс:Grails подзапрос с «присоединиться» и «DetachedCriteria» держит неудачу

class Product { 

    String nr 
    String name 
    boolean allowBookingWithoutEvent 

    static hasMany = [events: Event] 
} 

class Event { 

    DateTime startDate 
    DateTime endDate 
    int userSize 

    static belongsTo = [product: Product] 
} 

class BookingProductEvent{ 

    Product product 
    Event event 

    static belongsTo = [bookingItem: BookingItem] 
} 

То, что я пытаюсь сделать, это положить вместе критерий (я мог бы также изменить другой механизм запроса если это не сработает).

я некоторые ограничения на класс продукта, но я только то, что продукты, которые имеют наименьшее 1 событие, - это позже, то завтра, когда она позднее 17:00 сегодня - не достигли максимальных заказов для Событие

def userNow = curUser ? new DateTime(curUser.timeZone) : DateTime.now() 
def today = userNow.withMillisOfDay(0) 

def eventMinStartDate 
if (userNow.isBefore(today.withHourOfDay(17).withMinuteOfHour(0).withSecondOfMinute(0))) 
    eventMinStartDate = today.plusDays(1) 
else 
    eventMinStartDate = today.plusDays(2) 

log.debug Product.createCriteria().get { 
    projections{ 
     count("id") 
    } 

    if (search && !search?.equals("")) { 
     or { 
      like("nr", "%" + search + "%") 
      like("name", "%" + search + "%") 
     } 
    } 

    or { 
     eq("allowBookingWithoutEvent", true) 
     and { 
      eq("allowBookingWithoutEvent", false) 
      events {        
       gt("startDate", eventMinStartDate) 
       createAlias('id','event_id') 

       lt "userSize", new DetachedCriteria(BookingProductEvent).build { 
        projections { 
         count("id") 
        }        
        bookingItem { 
         isNotNull("booking") 
        } 
        event { 
         eq("id", "event_id") 
        }  
       } 
      } 
     } 
    } 
} 

Не удалось найти способ подключения к событию основного запроса с событием подзапроса (BookingProductEvent). Я предположил, что мне нужно создать псевдоним, имеющий ссылку внутри подзапроса. Но в любом случае, когда я вынимаю DetachedCriteria, я не получаю ошибку. Я также упростил подзапрос, чтобы содержать только счет без псевдонима, но я продолжаю получать ошибку.

Но я получаю сообщение об ошибке:

2015-07-25 01:32:46,937 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver - MissingMethodException occurred when processing request: [GET] /test/shop/product 
No signature of method: com.test.shop.ShopController.events() is applicable for argument types: (com.test.shop.ShopController$_products_closure10_closure50_closure52_closure53) values: [com.test.shop.S[email protected]11c9d26] 

ответ

0

Я не могу дать вам полный ответ, так как есть биты, которые не имеют смысла и также отсутствуют, но я могу попробовать момент вы в праве направление:

String query="""select new map(p as product, e as event) from BookingProductEvent b left join Event e join Product p join bookingItem i where 
(p.allowBookingWithoutEvent = true and (b.event is not null and b.event.startDate > :eventMinStartDate)) and (i.bookingItem is not Null) and (p.nr like :search or p.name like :search) 
""" 
def input = [ eventMinStartDate: eventMinStartDate, search: '%'+search+'%'] 
def result = BookingProductEvent.executeQuery(query, input, [max: -1, offset: 0, readonly:true]) 

Надеясь, что сам вернет вам что-то, чтобы сейчас работать над фактическим запросом.

В вышеуказанной попытке вернуть продукт и событие domainClass таким образом result.product.id или result.event.id или который когда-либо был полем из этих классов домена, просто разверните/уменьшите карту, чтобы захватить то, что вы хотите захватить из вложенные отношения.

+0

Благодарим вас за подсказку. Я рассматриваю ваше решение как план резервного копирования, так как он запускает SQL-запрос. Мой вопрос состоял в том, как решить эту проблему с помощью критериев и/или отдельных элементов – Bernhard

Смежные вопросы