当前位置: 首页 > 面试题库 >

在MySQL中使用HQL,如何在分组依据之前排序结果集,以便选择正确的记录?

慕项明
2023-03-14
问题内容

有没有办法在单个查询中用HQL(或可能使用Hibernate Criteria)编写每组最大n个查询?

我正在努力解决与以下问题类似的问题:

架构:

  • 这本书有一个发布日期
  • 本书有一位作者
  • 作者有出版者

我手边有出版商,还有搜索日期。对于所有该出版商的作者,我想查找他们在搜索日期之前最近出版的书。

我一直在尝试使其工作(并研究了hibernate状态下的许多其他问题以及“每组最多”),但没有找到任何有效的示例。

在直接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中易于理解的一种方法的示例)。

在hibernate状态下,我无法构造一个模拟此条件的子查询。我也没有运气尝试使用这样的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])

有什么方法可以让hibernate状态执行我想做的事情,而不必旋转内存中的对象或跳回原始SQL?

这是针对MySQL数据库的,如果重要的话,可以通过Grails使用Hibernate。


问题答案:

为此,您需要一个SQL窗口函数。在Hibernate/ HQL中无法做到这一点,HQL不支持窗口功能。

greatest-n-per-group标签具有正确答案。例如,这种方法可读性很强,尽管并不总是最佳的。



 类似资料:
  • 此实例中的任务是获取数据库中每个作者的最新文章。 示例查询产生不可用的结果,因为它并不总是返回的最新消息。 目前公认的答案是 编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

  • 问题内容: 我正在尝试向先前存在的应用程序中添加功能,并且遇到了如下MySQL视图: 好,所以有一些聚合函数。您可以选择personID,因为您正在对其进行分组。但是它还会选择不在聚合函数中并且不属于GROUP BY子句的列。这怎么可能???它是否只是选择一个随机值,因为每个组中的值肯定不是唯一的? 我来自(MSSQL Server),那是一个错误。有人可以向我解释此行为以及为什么它在MySQL中

  • 问题内容: 我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: 该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。 例如,它可能返回: 当数据库中的记录是: 如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录? 问题答案: 一个简单的解决方案是将查询包裹与ORDER语句子选择 第一

  • 我们有一个具有以下配置的elasticsearch索引: 结果按字段“number”进行分组,并以这种方式返回每个数字的最佳匹配。但我需要的是一个自定义的评分/排序的结果的基础上的词在结果的顺序的正确性。所以对于“乔治·布什”的质疑,“乔治·布什”应该总是比“布什·乔治”得分更高。匹配短语搜索不适合我,因为我在搜索中使用模糊性。

  • 问题内容: 我正在尝试获取前N条记录(当按某些X列排序时),但结果设置却相反。以下语句是 不正确的 ,但可能说明了我的追求: 例如,列X可以是ID或时间戳;我想要最新的10条记录,但希望它们按时间先后顺序返回。 问题答案: 也就是说,您可能需要在子查询上使用别名,但除此之外,别名应该可以使用。

  • 问题内容: HQL可以在另一个查询的结果集上进行选择吗? 例如: 我可以在SQL中完成此操作,但是当我在HQL中尝试以上操作时,它只是向我显示语法错误“意外的令牌:(靠近第1行,第22列…”) 问题答案: HQL确实支持子查询,但是它们只能出现在select或where子句中。您提供的示例最好以HQL的直接陈述形式编写。例如: 如果查询所涉及的语句比复杂,我建议将该逻辑放入视图中,然后根据该视图创