我需要以非常快的方式检查数据库中是否存在行。 假设我有主键。 我在Hibernate的常见问题解答网站上找到了这段代码:
Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();
我刚开始使用spring,所以我将HibernateTemplate对象注入到我的类中。 如何翻译此代码段以使用HibernateTemplate。
有谁知道比这更好/更快的方式?
感谢。
答案 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);
}