HQL - 仅为每个对象属性返回单个对象,并按对象更新的最近时间排序

时间:2013-08-02 10:07:08

标签: hibernate postgresql playframework hql

我有一个名为PlaylistDayStats的模型,它与播放列表模型有关。我正在尝试执行以下查询,但如果它们与同一个播放列表相关,我不想返回两个PlaylistDayStats。我只想根据最近更新的PlaylistDayStat返回第一个。

我的初步查询是:

select p from PlaylistDayStats p where order by p.updated desc

我怎样才能增加查询,以便它只为每个“p.playlist”返回一个“p”,基于哪一个首先使用“p.updated desc”返回?

更新:

基于Joe Taras的例子,我做了一个更新,在那里我还需要考虑过滤到某个用户的PlaylistDayStats ...所以“p.user = johndoe@gmail.com”。我还需要保持秩序。这个新查询似乎对我有用,但是我不确定我所做的更新是否是进行查询的最有效方式,或者我是否可能会将其他内容搞砸到我没预料到的内容。

select p 
from PlaylistDayStats p 
where not exists( 
    select 'next'  
    from PlaylistDayStats p2  
    where p2.playlist.id = p.playlist.id  
    and p2.updated > p.updated  
    and p2.user = johndoe@gmail.com  
)  
and p.user = johndoe@gmail.com 
order by p.updated desc

1 个答案:

答案 0 :(得分:1)

在HQL中

你不能使用TOP,LIMIT,ROWNUM,因为在所有者DBMS中以不同的方式进行管理。

因此,如果您只想获得一个元素,则必须更改查询,根据某些条件引入NOT EXISTS子句允许您选择“last”元素。在您的情况下,修复播放列表您的条件是字段“更新”

试试这个:

select p
from PlaylistDayStats p 
where not exists(
    select 'next'
    from PlayListDayStat p2
    where p2.playList = p.playList
    and p2.updated > p.updated
    and p2.user = p.user
)
and p.user = YOURVARIABLE

如果您有关于区分记录的其他条件,请将它们添加到子查询的where子句