hibernate查询的一些优化写法

项目中使用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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杂烩

分布式服务框架之Dubbo整合Spring项目(二)

1082
来自专栏函数式编程语言及工具

Akka(30): Http:High-Level-Api,Routing DSL

  在上篇我们介绍了Akka-http Low-Level-Api。实际上这个Api提供了Server对进来的Http-requests进行处理及反应的自定义F...

23010
来自专栏zaking's

RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)

1542
来自专栏Kubernetes

Kubernetes GC in v1.3

本文是对kubernetes GC proposal的解读分析,是对GC in kubernetes v1.3的内部结构剖析,并记录了其中一些关键点,以便日后能...

3035
来自专栏游戏杂谈

基于SOUI开发一个简单的小工具

Duilib 很久不维护了,而很多不同的分支,似乎都不太维护。微信 Windows 的版本是基于 Duilib 进行开发的,说明应该还是很广泛的。

4233
来自专栏Jerry的SAP技术分享

Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集

S4/HANA里有一个新的UI框架叫做Smart template, 配合ABAP后台的CDS view技术,能够让developer以Metadata dri...

2268
来自专栏zaking's

RFC2616-HTTP1.1-Methods(方法规定部分—单词注释版)

1255
来自专栏Hongten

pygame系列_箭刺Elephant游戏_源码下载

http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html

1724
来自专栏菩提树下的杨过

ExtJs+WCF+LINQ实现分页Grid

上篇文章《用ExtJs+Linq+Wcf打造简单grid 》,这个网格控件不带分页,本文在上文的基础上添加分页功能,文中会着重介绍如何在用LINQ返回分页数据,...

3567
来自专栏岑玉海

Distribute Cached 使用

  在Kettle中说到Pentaho的MapReduce要用到它,就查了一下关于它的资料,以下是从官方查到的内容,记录一下。   DistributedCac...

2764

扫码关注云+社区

领取腾讯云代金券