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

| 例如:
EXISTS ( SELECT * FROM [table] WHERE ... )
如何使用Hibernate进行此类查询?     
已邀请:
如果您的目标是检查一些空度,则可以使用简单的HQL查询:
boolean exists = (Long) session.createQuery(\"select count(*) from PersistentEntity where ...\").uniqueResult() > 0
    
HQL不允许使用
exists
语句。 UPD从Hibernate 5开始,在WHERE中将其作为谓词支持 您可以使用几种方法: 对于Hibrnate 5:您可以对同一表table3ѭ使用子查询。感谢作者贝娄。
count(*) > 0
,但这对性能不利。当可以使用EXISTS()时,请避免在SQL中使用COUNT() 使用ѭ5,但这会强制Hibernate加载所有字段并使对象水化,即使您只需要检查是否为null。 使用
session.get(PersistentEntity.class, id) != null
,如果启用了二级缓存,它将更快地工作,但是如果您需要的标准不只是
id
,那么这将是一个问题。 您可以使用以下方法:
getSession().createQuery(\"select 1 from PersistentEntity where ...\").uniqueResult() != null)
    
如果我们使用WHERE子句,则数据库可能必须扫描整个表以对符合我们条件的记录进行计数,但是我们可以限制为仅搜索一条记录,这足以说明空度。 如果没有任何搜索过滤器,则先前的查询将是可以接受的,因为数据库将使用索引进行一些优化。 所以我想以下查询将比以前的查询增加一些性能:
boolean exists = session.createQuery(\"from PersistentEntity where ...\").setMaxResults(1).uniqueResult() != null;
    
关于使用EXISTS有一些不错的评论,但没有示例。这是我在Hibernate 5.2中的解决方案:
boolean exists = session.createQuery( 
                    \"SELECT 1 FROM PersistentEntity WHERE EXISTS (SELECT 1 FROM PersistentEntity p WHERE ...)\")
            .uniqueResult() != null;
    
我使用了以下内容:
SELECT COUNT(e) FROM Entity e
。在Spring Data JPA中工作得很好。     
另外,如果使用
JpaRepository
,则可以通过ORM轻松检查实体的存在。这是一个Kotlin示例:
interface UserRepository : JpaRepository<User, Long> {
    fun existsByUsername(username: String): Boolean
}
    
尝试:
\"select count(e) > 0 from Entity e where...\"
使用Spring Data可以正常工作。     

要回复问题请先登录注册