zoukankan      html  css  js  c++  java
  • Hibernate的SQLQuery实体类查询(持久类PO或非持久类JavaBean)

    用触发模式安全调用HibernateTemplate对数据库的访问

    Spring为Hibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现:

    • public final HibernateTemplate getHibernateTemplate()
    • public final void setSessionFactory(SessionFactory sessionFactory)

    其中,setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例;getHibernateTemplate方法则用来根据刚才的SessionFactory产生Session,最后生成HibernateTemplate来完成数据库访问。
    HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增删修查、对分页的支持等操作。HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式是通过如下两个方法完成:

    • Object execute(HibernateCallback action)
    • List execute(HibernateCallback action)

    HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。
    通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。
    还有的就是采用:HibernateTemplate.execute(HibernateCallback action)这种回调的方式,封装了对异常的处理和对事务的一些处理。回调实际就是一种事件触发模式。

        this.getHibernateTemplate().execute(new HibernateCallback(){
    
    			@Override
    			public Object doInHibernate(Session arg0) throws HibernateException, SQLException {
    				// TODO Auto-generated method stub
    				return null;
    			}
    			
    		});
    

    上面就是这个方法的整体结构,具体业务代码写在TODO位置。

    SQL查询

    Hibernate支持原生的SQL查询,SQL语句也支持将SQL语句放入配置文件中配置,从而提高程序的解耦。尽量不要使用SQL查询。
    SQL查询通过SQLQuery接口表示,SQLQuery接口是Query的子接口,因此完全可以调用Query接口的方法。

    • setFirstResult()设置返回结果的起始点
    • setMaxResults()设置查询获取的最大记录数
    • list()返回查询到的结果集

    但SQLQuery比Query多了两个重载方法

    • addEntity()将查询到的记录与特定的实体关联
    • addScalar()将查询到的记录关联成标量值

    一般执行步骤

    1. 获取Hibernate Session对象
    2. 编写SQL
    3. 以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象
    4. 调用addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联
    5. 如果SQL语句包含参数,调用setXxx方法为参数赋值
    6. 调用list()方法返回查询的结果集

    实体查询

    1. 查询返回某个数据表的全部数列(记住:是全部数列),且该数据表有对应持久化类映射,我们可以把查询结果转换为实体,可以使用addEntity()方法。
    this.getHibernateTemplate().execute(new HibernateCallback(){
    			@Override
    			public Object doInHibernate(Session session) throws HibernateException, SQLException {
    				String hql = "select * from template_attached_relation order by attached_type_name";
    				return session.createSQLQuery(sql).addEntity(TemplateAttachedRelation.class).list();
    			}
    			
    		});
    

    使用原生SQL查询必须注意的是,程序必须选出所有数据才可以被转换成持久实体。因为现在没用<many-to-one.../>就不考虑了。还支持多表连接将结果转换成多个实体,同样必须是所有数据。
    2. 查询结果转换为非持久化实体(普通的JavaBean),只要该JavaBean为这些数据提供了对应的setter和getter方法即可。
    Query接口提供一个setResultTransformer()方法,该方法可以接受一个Transformers对象,通过该对象即可把查询到的结果集转换成JavaBean集。

    this.getHibernateTemplate().execute(new HibernateCallback() {
    
    			public Object doInHibernate(Session session) throws HibernateException, SQLException {
    				String sql = "select distinct attached_type_name as attachedTypeName,attached_type_id as attachedTypeId from template_attached_relation order by attachedTypeName";
    				List list = null;
    				SQLQuery query = null;
    				query = session.createSQLQuery(sql);
    				list = query.addScalar("attachedTypeName", Hibernate.STRING)
    						.addScalar("attachedTypeId", Hibernate.STRING)
    						.setResultTransformer(Transformers.aliasToBean(TemplateAttachedRelation.class)).list();
    				return list;
    			}
    			
    		});
    

    上面的自己的例子中attached_type_name列和attached_type_id列分别为他们指定了别名为attachedTypeName和attachedTypeId------这就要求JavaBean类也提供这两个属性,即为这两个属性提供setter和getter方法。另外SQL语句中别名的大小写和是否驼峰没有关系,因为SQL对大小写不敏感。

    public class TemplateAttachedRelation implements Serializable {
        private static final long serialVersionUID = 1L;
        /**
         * 附件编号
         */
        private String attachedTypeId;
    
        /**
         * 附件名称
         */
        private String attachedTypeName;
        //下面省略了getter和setter方法
        ...
    

    部分参考《JavaEE企业应用实战》·李刚
    欢迎批评指正!!

  • 相关阅读:
    图形合并
    启动脚本
    图形合并
    :(){:|:&};:
    C言语教程第八章:列举,位运算(5)
    C言语图形情势编程,赋性鼠标(4)
    C言语教程第十章:文件(6)
    C言语教程第十章:文件(4)
    红帽为什么要连结桌面Linux
    阶乘较劲争论器改善版
  • 原文地址:https://www.cnblogs.com/himonkey/p/9702610.html
Copyright © 2011-2022 走看看