Hibernate的查询方式知多少 二

继上篇博客,我们继续说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中要拿的 名字对应上。
如图:Hibernate的查询方式知多少 二_第1张图片

优点:

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

缺点:

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

总结:

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

你可能感兴趣的:(Hibernate)