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

Ron*_*Ron 9 hibernate hql

例如:

EXISTS ( SELECT * FROM [table] WHERE ... )
Run Code Online (Sandbox Code Playgroud)

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

sto*_*ito 13

HQL不允许使用exists语句.但是你可以使用几种方法:

  1. boolean exists = session.createQuery("select 1 from PersistentEntity where exists (select 1 from PersistentEntity p where ...)").uniqueResult() != null;但这对性能有害当你可以使用EXISTS时避免在SQL中使用COUNT()
  2. 使用,count(*) > 0但这将迫使Hibernate加载所有字段并对对象进行水合,但您只需要检查null.
  3. 使用boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;,如果你启用了二级缓存,这将更快地工作,但如果你需要更多的批评,那将是一个问题session.get(PersistentEntity.class, id) != null.
  4. 您可以使用以下方法: id


use*_*and 12

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

boolean exists = (Long) session.createQuery("select count(*) from PersistentEntity where ...").uniqueResult() > 0
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`count(*)`进行检查,因为所有聚合查询都不利于性能https://blog.jooq.org/2016/09/14/avoid-using-count-in-sql-when-you -could - 使用 - 存在/ (10认同)
  • 斯托基托是对的.迟到总比不到好. (5认同)

Myk*_*nko 5

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

如果没有任何搜索过滤器,则可以接受先前的查询,因为数据库将使用索引进行一些优化.

所以我认为以下查询将增加一些性能与前一个相比:

boolean exists = session.createQuery("from PersistentEntity where ...").setMaxResults(1).uniqueResult() != null;
Run Code Online (Sandbox Code Playgroud)