hibernate 查询话语统一配置管理

hibernate 查询语句统一配置管理

      你以前所参与的项目里面,SQL、HQL,是否满天飞呢?在逻辑层,显示层那里都可以看到随手写的查询语句?这样的做法极度的破坏了分层的架构,无论如何的XP也应该遵循一定的管理与规范,那么统一管理查询语句的重要性就凸现了。

      统一管理查询语句有何优点?

      1、保持系统的分层架构,管理语句是持久层的责任,由它自己管理是最适合不过。松散的耦合总是我们向往的目标。

      2、统一管理方便修改,可以减小人手修改带来的低级错误。

     

      OK,接下来要考虑如何管理这些语句来了。

      1、配置文件管理

      在hibernate的mapping文件内使用<query>     

<query name='findUserById'> 
     from User eo where eo.id = ? 
</query>

      <query>里面就是要使用的hql语句 属性name就是语句保存在容器里的别名。

    

      在hibernate的mapping文件内使用<sql-query>    

<sql-query name="findUserByName"> 
     <return alias="user" class="hibernate.entity.User"/> 
               SELECT user.id AS {user.id}, 
                            user.name AS {user.name} 
               FROM t_user user WHERE user.name = ? 
</sql-query>

     <sql-query>里面的语句必须是sql语句,属性name就是语句保存在容器里的别名,<reruen>里面的东东标明了返回对象的类型与别名,别名主要用于对应sql里面{}的内容。

   

      写好mapping文件后当然要告诉hibernate将这些语句加入到容器里面咯,配置方法有很多种,这里只列了使用spring结合hibernate的配置方式,在SessionFactoryBean的配置里面加入     

<property name="mappingLocations"> 
       <list> 
           <value> 
                classpath:hbm/name-query.hbm.xml 
           </value> 
       </list>
</property>



    <sql-query>的使用比较复杂,所以不是遇到复杂的跨表查询时,不推荐使用。

     

 

     2、标签管理

       一般的习惯都是使用@NamedQueries将与自己相关的语句统一在实体里面,如查询User的语句都是放到User对象里面

@Entity
@Table(name = "t_user") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @NamedQueries( { 
       @NamedQuery(name = "User.findById", 
               query = "FROM User eo where eo.id=? ") }) 
public class User implements java.io.Serializable { 
                
                private int id; 
         
                private String name;

     使用标签管理可以比较好的分类查询语句,也不用搞麻烦的配置文件,虽然说修改配置文件的查询语句可以不用重新编译就能生效,但是查询语句修改也不会十分频繁,所以标签管理是一个不错的选择。

 

      或者以上的方式都不喜欢,你甚至可以自己写统一管理查询语句的文件,手工注入到你的系统容器内,在DAO层写一套自己的NamQuery也是可以的。萝卜青菜,各有所爱,每个人都会有自己习惯的管理方式,但无论方式是什么,起码有这种想法都是好的。

 

 

 

 

1 楼 laiseeme 2008-08-01  
还是习惯在dao曾弄  你这个也不能集成啥的  比如大家公用基类的crud
2 楼 daquan198163 2008-08-01  
于是当你要看一个DAO的查询逻辑时,还得打开配置文件
用过一段时间 namedquery,觉得比较麻烦,不够pragmatic
3 楼 benbencen 2008-08-02  
回“daquan198163”:
你好,我倾向于将查询语句用annotation放到各自的实体里面。其实只要基类的DAO扩展的好一点,除了复杂的查询外都可以直接用DAO完成CRUD,这样每个实体语句的数量都是极小的。我觉得花费在统一维护语句的工作量绝对可以在语句重用与减小错误的方面翻倍的取回来。
4 楼 benbencen 2008-08-02  
回“laiseeme”:
你好,本文只是从管理语句的角度出发讨论,都是围绕NameQuery的,并没有将DAO的东东牵涉进来,其实你完全可以写一个完备的DAO基类来实现简单的CRUD,再配合NameQuery的使用。
5 楼 daquan198163 2008-08-05  
benbencen 写道
回“daquan198163”:
你好,我倾向于将查询语句用annotation放到各自的实体里面。其实只要基类的DAO扩展的好一点,除了复杂的查询外都可以直接用DAO完成CRUD,这样每个实体语句的数量都是极小的。我觉得花费在统一维护语句的工作量绝对可以在语句重用与减小错误的方面翻倍的取回来。

有些hql的归属是比较模糊的,将来就不确定到哪个实体里去找