例如:
EXISTS ( SELECT * FROM [table] WHERE ... )
如何使用Hibernate进行此类查询?
答案 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
您可以使用以下几种方法:
boolean exists = session.createQuery("select 1 from PersistentEntity where exists (select 1 from PersistentEntity p where ...)").uniqueResult() != null;
一起使用。感谢作者贝罗。count(*) > 0
但这对性能Avoid Using COUNT() in SQL When You Could Use EXISTS() boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;
但这会强制Hibernate加载所有字段并使对象保持水分,即使您只需检查空值。session.get(PersistentEntity.class, id) != null
如果您启用了二级缓存,这将更快地运行,但如果您需要更多的批评而不仅仅是id
,那么这将是一个问题。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。