我正在使用Hibernate检索特定查询的行数。假设我有一个名为“ Person”的表,其中包含各种列。这些列之一是“名称”。
如果我想获得带有“安德鲁”名字的人数,以下哪种方法最有效?假设某些/全部之间存在性能差异。使用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
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(*)
count(col)
col
因此,如果它们col可以为NULL(count(*)更快),它们将在性能和查询结果上给出不同的结果,否则性能相同。
我会用(3)。