Hibernate:如何进行EXISTS查询? (不是子查询)

时间:2011-04-13 21:14:54

标签: hibernate hql

例如:

EXISTS ( SELECT * FROM [table] WHERE ... )

如何使用Hibernate进行此类查询?

7 个答案:

答案 0 :(得分:11)

如果你的目标是检查一些关于空虚的设置,你可以使用简单的HQL查询:

boolean exists = (Long) session.createQuery("select count(*) from PersistentEntity where ...").uniqueResult() > 0

答案 1 :(得分:11)

HQL不允许使用exists语句。 UPD 从Hibernate 5开始it supports it as a predicate in WHERE

您可以使用以下几种方法:

  1. 对于Hibrnate 5:您可以将子查询与同一个表boolean exists = session.createQuery("select 1 from PersistentEntity where exists (select 1 from PersistentEntity p where ...)").uniqueResult() != null;一起使用。感谢作者贝罗。
  2. count(*) > 0但这对性能Avoid Using COUNT() in SQL When You Could Use EXISTS()
  3. 不利
  4. 使用boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;但这会强制Hibernate加载所有字段并使对象保持水分,即使您只需检查空值。
  5. 使用session.get(PersistentEntity.class, id) != null如果您启用了二级缓存,这将更快地运行,但如果您需要更多的批评而不仅仅是id,那么这将是一个问题。
  6. 您可以使用以下方法:getSession().createQuery("select 1 from PersistentEntity where ...").uniqueResult() != null)

答案 2 :(得分:5)

如果我们使用WHERE子句,数据库可能必须扫描整个表来计算符合我们条件的记录,但是我们可以限制只搜索一条记录,这足以说明空虚。

如果没有任何搜索过滤器,则可以接受上一个查询,因为数据库会使用索引进行一些优化。

所以我认为以下查询会比以前的查询增加一些性能:

boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;

答案 3 :(得分:2)

关于使用EXISTS的一些不错的评论,但没有示例。这是我在Hibernate 5.2中的解决方案:

boolean exists = session.createQuery( 
                    "SELECT 1 FROM PersistentEntity WHERE EXISTS (SELECT 1 FROM PersistentEntity p WHERE ...)")
            .uniqueResult() != null;

答案 4 :(得分:0)

我使用了以下内容:SELECT COUNT(e) FROM Entity e。在Spring Data JPA中工作得很好。

答案 5 :(得分:0)

此外,如果您使用JpaRepository,则可以通过ORM轻松检查实体是否存在。这是一个Kotlin示例:

interface UserRepository : JpaRepository<User, Long> {
    fun existsByUsername(username: String): Boolean
}

答案 6 :(得分:-1)

尝试:

jQuery(document).ready(function($){ ...

适用于Spring Data。