Hibernate的查询方式知多少 二

本文深入解析Hibernate中的动态分离查询(DetachedCriteria)与命名查询,阐述了它们如何实现业务与数据库访问的分离,以及各自的适用场景与优缺点。同时,介绍了如何在配置文件中定义命名查询,提升系统的维护性。最后总结了各种查询方式的应用策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇博客,我们继续说Hibernate的后边几个查询方式。

四、DetachedCriteria

这种查询叫做动态分离查询。即,业务和DAO实现分离的一种方式,查询条件是需求,千变万化,但是实现很简单,绑定条件后,只要使用一个list方法就发送了请求,所以我们可以把查询条件从实现的代码中分离出来。业务逻辑和访问数据库的实现分离,需要的时候,再结合,体现的是松耦合的思想。
看代码示例:

// 底层实现
static List accessDB(DetachedCriteria dc) {
   Session s = HibernateUtil.getSession();
   Criteria c = dc.getExecutableCriteria(s);
   List rs = c.list();
   s.close();
   return rs;
  } 
// 业务
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
   int id = 1;
   if (id != 0)
    dc.add(Restrictions.eq("id", id));
   Date age = new Date();
   if (age != null)
    dc.add(Restrictions.le("birthday", age));
   List users = accessDB(dc);
   System.out.println("离线查询返回结果:" + users);

上例中,第一个方法是数据库访问的代码,第二个方法是 业务查询的定义,在其他中,将DetachedCriteria定义好后,调用了执行数据库访问的操作:List users = accessDB(dc)。

适用情况:

  • 面向对象操作,

  • 分离业务与底层,

  • 不需要字段属性摄入到Dao实现层。

缺点:

  • 同Criteria一样,适用面较HQL有限。

    五、命名查询

有点像ibatis轻量级框架的操作,具体的实现是把查询语句从java类中转移到了hbm配置文件中。在配置文件中,通过标签来定义查询语句。
看如下示例代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
     <class name="com.sy.vo.User" table="user" catalog="news"> 
     </class>
     <!-- 命名查询:定义查询条件 -->
     <query name="getUserById">
      <![CDATA[from User where id=:id]]>
     </query>
     <!-- 命名查询中使用sql,不推荐使用,影响跨数据库
    <sql-query name="getUserById2">
      <![CDATA[select * from User where ]]>
     </sql-query> -->
</hibernate-mapping>

读取配置文件的代码:

static List namedQuery(int id) {
   Session s = HibernateUtil.getSession();
   Query q = s.getNamedQuery("getUserById");
   q.setInteger("id", id);
   return q.list();
  }

PS: 配置文件中的query的name一定要和 java中要拿的 名字对应上。
如图:这里写图片描述

优点:

  • 方便维护。
    将查询语句,写到xml中,后期改动方便,不用重现编译,发布系统。

缺点:

  • 比起Criteria来说,不面向对象。

总结:

各种查询方式有各自的优势,系统中使用的时候,也不是只能使用一种,我们要会在合适的时候使用的合适的查询方式,来达到我们实现需求的目的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值