hibernate 查询语句统一配置管理

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

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

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

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

     

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

      1、配置文件管理

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

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

<query name='findUserById'>
     from User eo where eo.id = ?
</query>      <query>里面就是要使用的hql语句 属性name就是语句保存在容器里的别名。

    

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

Xml代码
<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 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的配置里面加入     

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

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

 

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

     

 

     2、标签管理

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

Java代码
@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; 

@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;

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

时间: 2024-09-12 06:06:29

hibernate 查询语句统一配置管理的相关文章

hibernate查询语句--HQL

1.from 1.1单表查询 from eg.cat as cat.其中,cat只是一个别名,为了用其他子语句的时候书写简单 1.2多表查询 from eg.Cat,eg.Dog from eg.Cat as cat,eg.Dog as dog 2.join相关 (inner) join left (outer) join right (outer) join full join HQL同样对SQL中的这些特性支持 下面插播一个小话题,关于上边的那些特性,我一直都没怎么用,今天既然说到这里,就想

请教各位同仁有关hibernate查询语句中order by中null值的处理,

问题描述 目前有个DAO方法,采用HQL进行查询,最后order by A desc ,但A有空值,由于,后台数据库是oracle,所以采用desc到话,默认null值最大,查询出来的结果排在了最前面,实际需求需要把空值的结果集放在最后.不知道各位有没有遇到类似的问题,帮忙解决一下!先谢谢了 解决方案 最最土的办法:加一个标识列alter table xx add (flags char(1) default '0');update xx set flags = '1' where tt is

hql 多对一查询语句如何写

问题描述 hql 多对一查询语句如何写 public A { private long id; private String a; private B b; } public B{ private long id; private String b; } 现在我知道了B类的id和A类的变量a,要查出整个A类,hql语句怎么写啊,在线急等,求大神指点 解决方案 hibernate查询语句--HQLhibernate查询语句--HQLhibernate查询语句--HQL 解决方案二: 是B类的所有I

hibernate4-想请大家帮忙下 用hibernate如何写查询语句

问题描述 想请大家帮忙下 用hibernate如何写查询语句 例如 group表 plate表 id name plate_id id name 1 用户管理 1 1 系统管理 2 :机构管理 1 2 业务管理 3 菜单管理 1 4 角色管理 1 5 业务查询 2 如何查询得到: 主 从 系统管理: 用户管理 机构管理 菜单管理 角色管理 业务管理: 业务查询

SQL查询语句对象化的实现(C#)

对象|语句   在开发数据库应用的过程难免会编写大量的SQL语句,其中大部份是查询语句:为不同情况编写查询语句是一件很烦琐的事件.用过hibernate或Nhibernate会了解到把SQL查询语句对象化后使用起非常方便和快捷:也大大减少在编写查询SQL语句所带来的错误等问题.        前段时间在编写一个数据处理类的时候同样遇到这个问题,经过一段时间思考和设计现实现了SQL查询语句对象化的功能:在这里我把自己小小的成果共享一下. 在讲解前先看几个例子(数据是SQLServer的Northw

设计-关于hibernate查询的和开发中的一些疑问

问题描述 关于hibernate查询的和开发中的一些疑问 我在开发的过程中遇到一些疑问,希望各大牛帮我解答下. 环境介绍: 假设现在有2个表 表名:category(文章分类) 字段: id 主键 name 文章分类中文名 desc 描述 表名:article(文章列表) 字段: id 主键 categoryid 分类id title 文章标题 content 内容 因为用的是hibernate, 上面两个表对应的PO分别是CategoryPO , ArticlePO.没有配置外键映射. 现在要

hibernate-web后台的sql查询语句问题

问题描述 web后台的sql查询语句问题 我使用spring+hibernate的框架做的后台,在dao层中sql查询语句查询所有select * from tbplayer t1 where nickname='"+shopID+"'就可以查出结果,然后在拼接显示自己想要的内容,但是一旦换成查某个字段select p3_account from tb_player t1 where nickname='"+shopID+"'就报错,说没有psn这列,但是我的语句中

ehcache查询缓存,还会发出查询语句

问题描述 我在项目中加入了ehcache查询缓存,配置都正确,代码中也加入了query.setCacheable(true);在第一次查询时,观察控制台会发出一遍查询语句:Hibernate:selectrole0_.idasid1_2_,role0_.descriptionasdescript2_2_,role0_.rolenameasrolename3_2_fromhz_rolerole0_按理说配置了查询缓存,再次查询的时候不会发出查询语句的,但是我这里却又发送了查询语句,而且是两句话:H

java-JAVA后台动态拼接查询语句

问题描述 JAVA后台动态拼接查询语句 要重做一个系统,以前那个系统因为查询效率非常低下,所以要重做. 查询需求比较蛋疼:查询的字段,和查询条件都是要动态拼接的.因为之前的做法是把所有要显示的字段和查询的条件都写在一个视图里,查询的时候直接拼接where 条件就行了.基础视图查询了太多的字段(很多字段还是用了函数),关联了太多的表,倒是几乎没子查询. 现在他们想把基础视图简化,只查列表显示的常用字段,然后查询时去动态的拼表连接JOIN和WHERE条件,我想了半天也没想出来应该怎么做.主要就是,查