下面是我的HQL语句,
from ActivateTask at3 
where not exists (
from ActivateTask at4 
where at4.terminal = at3.terminal 
and at4.activateDate > at3.activateDate
)and at3.status=0 
and at3.terminal in (
select at2.terminal 
from ActivateTask at2 
where not exists (
from ActivateTask at1 
where at1.terminal = at2.terminal 
and at1.activateDate > at2.activateDate

and (at2.status=0 or at2.status=3)
)
上面的table均为同一个表,该表的结构如下:
ID | DATE | TERMINAL | STATE
查询要求是:
 按照TERMINAL 字段进行分组,找到每组中
DATE最大
并且STATE=0
并且该组中DATE最大的记录的STATE必须等于0或3。
(由于每组中STATE=0并且DATE最大的记录可能不是该组中DATE最大的记录,因此要对该组中DATE最大的记录的STATE进行判断,如果等于0或3,再取该组中STATE=0并且DATE最大的记录,否则 该组就过滤掉,相当于没有记录可取)
例如:表
ID | DATE      | TERMINAL | STATE
0  | 20100506| 00001       | 0
1  | 20100606| 00001       | 1
2  | 20100706| 00001       | 0
3  | 20100806| 00001       | 3
4  | 20100506| 00002       | 0
5  | 20100606| 00002       | 0
6  | 20100706| 00002       | 1
7  | 20100506| 00003       | 0
8  | 20100606| 00003       | 0
查询结果应当为:
ID | DATE      | TERMINAL | STATE
2  | 20100706| 00001       | 0
8  | 20100606| 00003       | 0
注意:必须用HQL,如果用SQL,我自己也会避免使用in exists等关键字提升性能,关键是现在必须用HQL,HQL中好像不支持from(select...), othertable的形式进行嵌套查询,所以分组取最大值很难实现,因此,我通过上面的HQL实现了要求,可是我怕性能不能保障,请高手看看有没有性能提升的空间,或者帮忙重新写一条HQL语句,只要能达成上面功能的又比我的HQL性能好的。