项目中使用hibernate进行数据库查询,但由于项目历时较长,经手的人较多,DAO层的代码风格很不致,这里将一些常见的场景进行归纳,并给出推荐的写法。

  • 根据ID查询实体
// 不推荐
Demo demo = getSession().createQuery("from Demo where id=?").setLong(0, id).uniqueResult();
// 推荐
Demo demo = getHibernateTemplate().get(Demo.class, id);
  • 根据某些条件查询
// 不推荐
List<Demo> demos = getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).list();
// 推荐
List<Demo> demos = getHibernateTemplate().find(hql, param1, param2);
  • 根据某个条件查询唯一的返回值
// 不推荐
Demo demo = getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).uniqueResult();
// 推荐
Demo demo = DataAccessUtils.uniqueResult((List<Demo>)getHibernateTemplate().find(hql, param1, param2));
  • 删除、保存、更新实体
// 不推荐
getSession().delete(demo);
getSession().save(demo);
getSession().saveOrUpdate(demo);
getSession().update(demo);
// 推荐
getHibernateTemplate().delete(demo);
getHibernateTemplate().save(demo);
getHibernateTemplate().saveOrUpdate(demo);
getHibernateTemplate().update(demo);
  • 执行更新操作
// 不推荐
getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).executeUpdate();
// 推荐
getHibernateTemplate().bulkUpdate(hql, param1, param2);
  • 执行SQL
// 不推荐
getSession().createSQLQuery(sql).setLong(0, param1).setParameter(1, param2).executeUpdate();
// 推荐
getHibernateTemplate().execute(new HibernateCallback<Void>() {
    @Override
    public Void doInHibernate(Session session) throws HibernateException, SQLException {
        session.createSQLQuery(sql).setLong(0, param1).setParameter(1, param2).executeUpdate();
        return null;
    }
});
  • 查询数目
// 不推荐
Long count = (Long)getSession().createQuery("select count(*) from Demo where param1=? and param2=?").setParameter(0, param1).setParameter(1, param2).uniqueResult();
// 推荐
long count = DataAccessUtils.longResult(getHibernateTemplate().find("select count(*) from Demo where param1=? and param2=?", param1, param2));
  • 分页查询
// 不推荐
Query query = getSession().createQuery(hql).setParameter(0, param1).setParameter(1, param2);
query.setFirstResult(offset);
query.setMaxResults(limit);
List<Demo> demos = query.list();
// 推荐
List<Demo> demos = getHibernateTemplate().executeFind(new HibernateCallback<List<Demo>>() {
    @Override
    public List<Demo> doInHibernate(Session session) throws HibernateException, SQLException {
        Query query = session.createSQLQuery(hql).setLong(0, param1).setParameter(1, param2);
        query.setFirstResult(offset);
        query.setMaxResults(limit);
        return query.list();
    }
});
  • 使用Criteria
// 不推荐
Criteria criteria = getSession().createCriteria(Demo.class);
criteria.add(Restrictions.eq("param1", param1));
List<Demo> demos = criteria.list();
// 推荐
DetachedCriteria criteria = DetachedCriteria.forClass(Demo.class)
    .add(Restrictions.eq("param1", param1));
List<Demo> demos = getHibernateTemplate().findByCriteria(criteria);
  • 使用Criteria加分页功能
Criteria criteria = getSession().createCriteria(Demo.class);
criteria.add(Restrictions.eq("param1", param1));
List<Demo> demos = criteria.list();
// 推荐
DetachedCriteria criteria = DetachedCriteria.forClass(Demo.class)
    .add(Restrictions.eq("param1", param1));
List<Demo> demos = getHibernateTemplate().findByCriteria(criteria, offset, pageSize);