我正在使用Hibernate来检索特定查询的行数。假设我有一个名为'Person'的表,其中包含各种列。其中一列是'name'。
如果我想获得名为“安德鲁”的人数,哪种方式最有效?假设它们中的一些/全部存在性能差异。有没有更好的方法来使用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)将Count与查询中的name列一起使用
Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
编辑:对不起,我的名单中有两个3号
答案 0 :(得分:14)
如果您只想计算行数,请不要检索结果集,这只是无用的开销:
Person
实体还是仅String
)。换句话说,如果您只想计算,请不要在Java端进行计数,DBMS针对此任务进行了优化,并且可以做得更好。
这不包括(1)和(2)。
关于(3)和(4),请注意count(*)
和count(col)
之间存在差异:
count(*)
计算所有行count(col)
计算非空值col
因此,如果col
可以为NULL(count(*)
更快),它们将在性能和查询结果中给出不同的结果,否则性能相同。
我会用(3)。
答案 1 :(得分:0)
count(*)
方法的分析速度明显快于我公司的size()
方法。它肯定更节省内存,因为您没有跨越您不会使用的列数据。我不知道count(name)
是否有所作为。
答案 2 :(得分:0)
你放入COUNT()
功能越少越好。如果您不需要表中的任何信息,我会说使用COUNT(1)
。只要表格被正确编入索引,您就可以使用COUNT(name)
或COUNT(*)
。