在MySQL中使用HQL,如何在分组依据之前排序结果集,以便选择正确的记录?
作者:互联网
有没有办法在单个查询中用HQL(或可能使用Hibernate Criteria)编写每组最大n个查询?
我正在努力解决与以下问题类似的问题:
架构:
>本书有出版日期
>书有作者
>作者有出版者
我手边有出版商,还有搜索日期.对于所有该出版商的作者,我想查找他们在搜索日期之前最近出版的书.
我一直在尝试使其工作(并查看了hibernate以及greatest-n-per-group下的许多其他问题),但没有找到任何有效的示例.
在直接MySQL中,我可以使用子选择来获得此信息:
select * from
(select
a.id author_id,
b.id book_id,
b.publication_date publication_date
from book b
join author a on a.id = b.author_id
join publisher p on p.id = a.publisher_id
where
b.publication_date <= '2011-07-01'
and p.id = 2
order by b.publication_date desc) as t
group by
t.author_id
这将强制排序依据首先在子查询中发生,然后分组依据随后发生,并选择最新出版的书籍作为分组依据的第一项.我得到的是作者ID,书籍ID和出版日期. (我知道这不是在SQL中执行此操作的特别有效的方法,这只是在原生SQL中易于理解的一种方法的示例).
在休眠状态下,我无法构造一个模拟此条件的子查询.我也没有运气尝试使用这样的hading子句,它返回零结果.如果我删除了hading子句,它会返回数据库中的第一本书(基于其ID),因为group by发生在order by之前:
Book.executeQuery("""
select b.author, b
from Book b
where b.publicationDate <= :date
and b.author.publisher = :publisher
group by b.author
having max(b.publicationDate) = b.publicationDate
order by py.division.id
""", [date: date, publisher: publisher])
有什么方法可以让休眠状态执行我想做的事情,而不必旋转内存中的对象或跳回原始SQL?
这是针对MySQL数据库的,如果重要的话,可以通过Grails使用Hibernate.
解决方法:
为此,您需要一个SQL window function.在Hibernate / HQL中无法做到这一点,HQL不支持窗口函数.
最伟大的每组标记具有正确的答案.例如,this approach可读性很强,尽管并不总是最佳的.
标签:mysql,hibernate,grails,greatest-n-per-group 来源: https://codeday.me/bug/20191013/1904748.html