2

我需要一些帮助来设置我的查询。如果可以避免的话,我不想进行多次选择以形成基本相同的子查询。简而言之,我调用TimeSlot了用于跟踪多个细节的对象。那些TimeSlot是支付的项目。当它TimeSlot提交报销时,它们被用来创建一个PayableTimeSlot. 在TimeSlot可以支付之前,我需要确保它尚未支付。

因为它位于以下是我的查询:

@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 中为 first 选择了一个元素not in。有没有办法将子查询扩展为: (select e.id, e.claimant from PayableTimeslot pts join pts.event e) 我只是不确定如何检查not in子查询的多个项目。无论如何,如果有比我这样做的方式更好的解决问题的方法,请告诉我。

除非你们都认为多重选择不会有什么大不了的……平均每周会有 30-50 个条目进入表中,每个条目被复制(用于审计跟踪)超过 7-9 次。

4

1 回答 1

0

好的,经过一番思考,这就是我想出的。我确实试图以错误的方式回答问题......当我需要的只是第一个的 where 时,我正在执行两个子查询,从而将两者结合起来。

@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 = ?)")
于 2013-10-03T19:41:05.443 回答