如何使用 JPQL 从 SELECT 操作中获取第一行?

Posted

技术标签:

【中文标题】如何使用 JPQL 从 SELECT 操作中获取第一行?【英文标题】:How can I obtain the first row from a SELECT operation using JPQL? 【发布时间】:2019-10-27 05:48:48 【问题描述】:

我有一个包含一些测试数据的数据库,我想使用它们的属性 DATE 对它们进行适当的排序,并且只取所有测试中的第一个。我的意思是,JPQL 中相当于 SQL 的 TOP 1。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您通常在触发 fetch 之前在 Query 对象上设置它:

entityManager.createQuery("...")
       .setMaxResults(1)
       .getResultList();

使用 Spring Data Jpa 语法,您将使用类似以下内容:

Optional<Test> findFirstByOrderByDateDesc();

或者使用Pageable:

Page<Test> test = repository.findAll(
    PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "date")));

【讨论】:

我在存储库中定义的方法中使用@Query 注释,因为我不太熟悉 JPA 语法和 Pageable。所以,我有类似“SELECT * FROM TEST t ORDER BY t.date DESC”之类的东西,它返回所有测试,但我想像 SQL 的 TOP 1 一样添加到查询中,是否有任何选项可以选择第一个以我的方式? 这里似乎需要选项 2【参考方案2】:

在 spring jpa 中你可以做这样的事情

Foo findTopByOrderByDateDesc(); //This will return 1st item

List<Foo> findTop10ByOrderByDateDesc(); //This will return top 10 item

供参考Spring Jpa Doc

【讨论】:

【参考方案3】:

最常见的

Foo findFirstByOrderByDateDESC();

使用 @QuerynativeQuery = true

@Query(value="SELECT 1 * FROM "TableName" ORDER BY "DATE in db" DESC LIMIT 1", nativeQuery = true)
Foo findFirstByOrderByDateDESC(Long id); // name can be random

【讨论】:

对我不起作用【参考方案4】:

在Spring Data JPA中,使用关键字firsttop,两者语义相同,我更喜欢top,因为有2个输入的字母更少;-)。

Foo findTopByOrderByDateDesc(); //假设前 1 个 Foo findFirstByOrderByDateDesc(); //假设前1个

如果要查找前 X 行,其中 X 是数字,请使用:

List findTopXByOrderByDateDesc(); List findFirstXByOrderByDateDesc();

如果您想记住处理 null 返回,请将结果包装在 Optional 中:

可选 findTopByOrderByDateDesc();可选 findFirstByOrderByDateDesc();

【讨论】:

以上是关于如何使用 JPQL 从 SELECT 操作中获取第一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPQL 中选择随机 10 条记录?

如何在 JPQL 中使用别名

如何使用嵌入式 id 编写 JPQL SELECT?

使用子句 IN 从 sql 转换为 jpql

JPQL 选择内部选择

如何在 JPQL 中查找第一个