使用Hibernate& amp;检查数据库中是否存在行的最快方法是什么?弹簧?

时间:2011-11-22 18:46:02

标签: java hibernate spring

我需要以非常快的方式检查数据库中是否存在行。 假设我有主键。 我在Hibernate的常见问题解答网站上找到了这段代码:

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

我刚开始使用spring,所以我将HibernateTemplate对象注入到我的类中。 如何翻译此代码段以使用HibernateTemplate。

有谁知道比这更好/更快的方式?

感谢。

4 个答案:

答案 0 :(得分:3)

Long count = hibernateTemplate.execute(new HibernateCallback<Long>() {
    @Override
    public Long doInHibernate(Session session) {
        return (Long) session.createQuery("select count(someEntity.id) from SomeEntiuty someEntity ...").uniqueResult();
    }
});

Hibernate之前使用Integer进行计数查询,但现在使用Long。另请注意,即使没有弃用,Spring也建议不再使用HibernateTemplate并直接使用Hibernate API(使用sessionFactory.getCurrentSession())。

答案 1 :(得分:0)

同样,这也取决于您使用MyISAM和innodb的引擎。

select count(col1) from table;将返回列不为空的行数。

select count(*) from table;将返回行数。

根据您使用的数据库,select count(*)比从元数据表或跟踪行数的系统级表读取它更昂贵。 我的2美分。

根据索引和其他信息/联接/访问权限等各种其他因素,这可能会更快

SELECT table_rows FROM `information_schema`.`TABLES` where table_schema = 'database_schema_name' and table_name = 'table_name';

答案 2 :(得分:0)

我认为最好找到第一行的特定代表字段(使用PK或至少另一个索引字段),而不是计算符合搜索条件的所有可能记录。

如果你正在使用Spring,如果没有找到记录,它将抛出EmptyResultDataAccessException。

答案 3 :(得分:0)

在数据库中存在或不存在检查主键的最快方法。

public void exist(Long id) {
    Session session = sessionFactory.getCurrentSession();
    String queryString = "select 1 from Employee e where e.id= :id";
    Query query = session.createQuery(queryString);
    query.setParameter("id", 1l);
    Integer result = (Integer) query.uniqueResult();
    System.out.println(result);

}