java - 计算查询行数的最有效方法

标签 java sql hibernate

我正在使用 Hibernate 检索特定查询的行数。假设我有一个名为“Person”的表,其中包含各种列。其中一列是“姓名”。

如果我想获得名为“Andrew”的人数,以下哪种方式最有效?假设其中一些/全部之间存在性能差异。使用 Hibernate/SQL 是否有更好的方法来做到这一点?

(1) 选择所有列

Query query = session.createQuery("from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();

(2)只选择名称列

Query query = session.createQuery("select name from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();

(3) 在查询中使用Count

Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();

(4) 在查询中对name列使用Count

Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();

编辑:抱歉,我的列表中有两个 3

最佳答案

如果您只想计算行数,请不要检索结果集,这意味着无用的开销:

  • 你会得到比实际想要的更多的东西(无论你是选择所有列还是只选择一列)
  • 您需要通过网络发送它们
  • 您需要免费创建实例(无论是完整的 Person 实体还是只是一个 String)。

换句话说,如果您只想计数,请不要在 Java 端执行,DBMS 针对此任务进行了优化,并且会做得更好。

这不包括 (1) 和 (2)。

关于(3)和(4),注意count(*)count(col)大体上是有区别的:

  • count(*) 计算ALL
  • count(col) 计算 non-null 值为 col
  • 的行

因此,如果 col 可以为 NULL(count(*) 更快),它们将在性能和查询结果上给出不同的结果,否则性能相同。

我会使用 (3)。

类似问题

关于java - 计算查询行数的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358843/

相关文章:

java - ManyToMany RelationShip 列不允许为 NULL

sql - 你能在 SQL 中定义 "literal"表吗?

hibernate - 为什么有不同类型的事务管理器?

java web 应用程序和 xslt - 当 xml/xslt 文件更改时会发生什么?

java - 在 android 中调用 SOAP 服务的问题

sql - SQL Server 中表提示的用途是什么?

SQL:这个 SQL 查询有什么问题

java - 使用 spring @transactional hibernate session.flush

java - 自动设置反向引用

java - 如何生成一个介于 -1 和 1 之间的随机数?