如何在 JPQL 中查找第一个

Posted

技术标签:

【中文标题】如何在 JPQL 中查找第一个【英文标题】:How to find first in JPQL 【发布时间】:2017-08-06 10:00:51 【问题描述】:

我有一个查询来查找数据库中是否已经存在一个值。我正在使用它在将资源插入数据库之前对其进行验证。 它看起来像这样:

  @NamedQuery(name = "findByName", query = "SELECT g FROM Group g where g.value= :value")

关于数据访问的实现如下:

final TypedQuery<Group> query = entityManager.createNamedQuery("findByName", Group.class);
    query.setParameter("value", value);
    return !query.getResultList().isEmpty();

它确实有效并且完成了这项工作,但是我认为 query.getResultList().isEmpty() 不是我需要的正确语法,而且我希望它更快并在找到值后返回而不是循环通过数据库上的每一行。 任何建议将不胜感激。

【问题讨论】:

你考虑过计数吗? Spring Data JPA and Exists query 您考虑过 COUNT 吗? Solution 不幸的是,Spring 不是一个选择,因为我们走了另一条路。现在做一个 COUNT 肯定会改善一点。但是我仍然不确定这个查询的 query.getResultList() 。欢呼 【参考方案1】:

怎么样:

 @NamedQuery(name = "existsByName", query = "SELECT CASE WHEN COUNT(g) > 0 THEN true ELSE false END FROM Group g where g.value= :value")

boolean exists = entityManager.createNamedQuery("existsByName",Boolean.class).setParameter("value",value).getSingleResult();

【讨论】:

有趣,看起来也很干净。非常感谢。【参考方案2】:

你有两个选择:

使用COUNT函数:

@NamedQuery(name = "findByName", query = "SELECT COUNT(g) FROM Group g where g.value= :value")

这消除了创建实际实体的惩罚(加上急切加载等)

使用TypedQuery.setMaxResults() 将检索到的最大结果数设置为1。

query.setMaxResults(1);

【讨论】:

【参考方案3】:

也许您可以考虑使用pagination 来提高速度。

query.setMaxResults(1).getResultList() 要么 setFirstResult()

【讨论】:

以上是关于如何在 JPQL 中查找第一个的主要内容,如果未能解决你的问题,请参考以下文章

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

如何以编程方式验证 JPQL(JPA 查询)

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

如何在一个 JPQL 查询中使用多个 JOIN FETCH

如何在jpql中选择列表元素的属性

如何在 JPQL 中检查 UUID 空值?