什么时候Critiber在Hibernate中更好?

时间:2013-01-31 20:59:21

标签: hibernate hql hibernate-criteria

假设我需要根据某些条件使用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();

哪一个更好,更平常(关于表现和其他事情)?

1 个答案:

答案 0 :(得分:2)

在您的情况下,这是一个偏好问题。 Criteria API类型安全且可能更快(您不需要为解析HQL付出代价)。另一方面,HQL可能更容易阅读,特别是对于具有SQL背景的人。

应该使用条件API的唯一地方是查询是动态的,例如基于某些输入,可以选择WHERE条件的任何子集。使用HQL,您将不得不从字符串构建HQL(看起来很糟糕)或者具有指数数量的每个新查询略有不同。