前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hibernate查询的一些优化写法

hibernate查询的一些优化写法

作者头像
jeremyxu
发布2018-05-10 17:59:21
1.2K0
发布2018-05-10 17:59:21
举报
文章被收录于专栏:jeremy的技术点滴

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

  • 根据ID查询实体
代码语言:javascript
复制
// 不推荐
Demo demo = getSession().createQuery("from Demo where id=?").setLong(0, id).uniqueResult();
// 推荐
Demo demo = getHibernateTemplate().get(Demo.class, id);

  • 根据某些条件查询
代码语言:javascript
复制
// 不推荐
List<Demo> demos = getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).list();
// 推荐
List<Demo> demos = getHibernateTemplate().find(hql, param1, param2);

  • 根据某个条件查询唯一的返回值
代码语言:javascript
复制
// 不推荐
Demo demo = getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).uniqueResult();
// 推荐
Demo demo = DataAccessUtils.uniqueResult((List<Demo>)getHibernateTemplate().find(hql, param1, param2));

  • 删除、保存、更新实体
代码语言:javascript
复制
// 不推荐
getSession().delete(demo);
getSession().save(demo);
getSession().saveOrUpdate(demo);
getSession().update(demo);
// 推荐
getHibernateTemplate().delete(demo);
getHibernateTemplate().save(demo);
getHibernateTemplate().saveOrUpdate(demo);
getHibernateTemplate().update(demo);

  • 执行更新操作
代码语言:javascript
复制
// 不推荐
getSession().createQuery(hql).setLong(0, param1).setParameter(1, param2).executeUpdate();
// 推荐
getHibernateTemplate().bulkUpdate(hql, param1, param2);

  • 执行SQL
代码语言:javascript
复制
// 不推荐
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));

  • 分页查询
代码语言:javascript
复制
// 不推荐
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
代码语言:javascript
复制
// 不推荐
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);

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档