Hibernate的查询方式知多少 二

来源:互联网 发布:图象扭曲算法 编辑:程序博客网 时间:2024/04/30 10:16

继上篇博客,我们继续说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来说,不面向对象。

总结:

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

0 0
原创粉丝点击