我正在使用 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/