假设我需要根据某些条件使用Hibernate计算数据库表中的行数,我可以使用org.hibernate.criteria
,如下所示。
@Service
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW)
public final class StateDAO implements StateService
{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
@Override
@SuppressWarnings("unchecked")
public Object rowCount(String id)
{
return sessionFactory.getCurrentSession()
.createCriteria(State.class)
.setProjection(Projections.rowCount())
.add(Restrictions.eq("countryId", Long.parseLong(id)))
.uniqueResult();
}
}
它根据通过Spring提供的id
来计算行数。
这也可以通过使用像。
这样的HQL查询来实现sessionFactory.getCurrentSession()
.createQuery("select count(*) as cnt from State where countryId=:id")
.setParameter("id", Long.valueOf(id).longValue())
.uniqueResult();
哪一个更好,更平常(关于表现和其他事情)?
答案 0 :(得分:2)
在您的情况下,这是一个偏好问题。 Criteria API类型安全且可能更快(您不需要为解析HQL付出代价)。另一方面,HQL可能更容易阅读,特别是对于具有SQL背景的人。
应该使用条件API的唯一地方是查询是动态的,例如基于某些输入,可以选择WHERE条件的任何子集。使用HQL,您将不得不从字符串构建HQL(看起来很糟糕)或者具有指数数量的每个新查询略有不同。