一尘不染

计算查询行的最有效方法

hibernate

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


阅读 234

收藏
2020-06-20

共1个答案

一尘不染

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

  • 您会得到比实际需要更多的东西(无论是选择所有列还是仅选择一个列)
  • 您需要通过电线发送它们
  • 您将不需要创建任何实例(无论是完整Person实体还是只是一个实例String)。

换句话说,如果您只想计数,而不是在Java方面这样做,那么DBMS已针对此任务进行了优化,并且会做得更好。

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

关于(3)和(4),请注意count(*)count(col)通常存在区别:

  • count(*)计算 所有
  • count(col)计算具有 非空 值的行col

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

我会用(3)。

2020-06-20