JPA避免多个子查询

时间:2013-10-03 13:58:59

标签: java jpa

我需要一些帮助来设置我的查询。如果我能避免它,我不想让多个选择形成基本相同的子查询。在一个坚果壳中,我有一个名为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中为第一个not in选择了一个元素。有没有办法将子查询扩展为: (select e.id, e.claimant from PayableTimeslot pts join pts.event e)我只是不确定如何检查子查询的多个项not in。无论如何,如果对问题的攻击比我正在做的更好,请告诉我。

除非你们都认为多重选择不会是一个大问题...每周平均会有30-50个条目进入表格,每个条目被复制(审计跟踪)超过7-9次。

1 个答案:

答案 0 :(得分:0)

好的,经过一番思考,这就是我想出来的。我确实试图以错误的方式回答这个问题......当我需要的只是第一个因此合并两个时,我正在做两个子查询。

@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 = ?)")