2013-10-03 3 views
2

Мне нужна небольшая помощь в настройке моего запроса. Я не хочу делать несколько выборок, чтобы сформировать в основном один и тот же подзапрос, если я могу его избежать. В ореховой оболочке у меня есть объекты, называемые TimeSlot, которые используются для отслеживания нескольких деталей. Эти TimeSlot - это товары, которые оплачиваются. Когда его время для TimeSlot для отправки на возмещение, они используются для создания PayableTimeSlot. Прежде чем TimeSlot может быть оплачен, мне нужно убедиться, что он еще не был оплачен.JPA, избегая нескольких подзапросов

Как сидит следующее мой запрос:

@NamedQuery(
    name = "TimeSlot.by.person.academy.id.by.contract.date", 
    query = "select distinct ts 
     from TimeSlot ts 
     join ts.invitedInstructors ii 
     join ts.academyClass ac 
     join ac.academy a 
     where ii.person.id = ? 
     and a.id = ? 
     and ts.schedule.startDateTime BETWEEN ? AND ? 
     and ts.id not in (select e.id from PayableTimeslot pts join pts.event e) 
     and ? not in (select e.claimant from PayableTimeslot pts join pts.event e)") 

Как вы видите, я уже выбрать элемент из PayableTimeSot для первого not in. Есть ли способ расширить подзапрос в: (select e.id, e.claimant from PayableTimeslot pts join pts.event e) Я просто не уверен, как проверить для нескольких элементов not in подзапрос. Во что бы то ни стало, если есть лучшая атака проблемы, чем то, как я это делаю, дайте мне знать.

Если вы все не считаете, что множественные выборы не будут большой сделкой ... В таблице будет в среднем 30-50 записей в неделю с каждой копируемой копией (для контрольного журнала) в 7-9 раз ,

ответ

0

Итак, после некоторого размышления, это то, с чем я столкнулся. Я действительно пытался ответить на проблему не так ... Я делал два запроса sub, когда все, что мне было нужно, было там, где на первом, таким образом, объединялось два.

@NamedQuery(
    name = "TimeSlot.by.person.academy.id.by.contract.date", 
    query = "select distinct ts " 
    + "from TimeSlot ts " 
    + "join ts.invitedInstructors ii " 
    + "join ts.academyClass ac " 
    + "join ac.academy a " 
    + "where ii.person.id = ? " 
    + "and a.id = ? " 
    + "and ts.schedule.startDateTime BETWEEN ? AND ? " 
    + "and ts.id not in (select e.id from PayableTimeslot pts join pts.event e where pts.claimant = ?)") 
Смежные вопросы