我需要一些帮助来设置我的查询。如果我能避免它,我不想让多个选择形成基本相同的子查询。在一个坚果壳中,我有一个名为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次。
答案 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 = ?)")