hibernate引用查询和联合查询

标签: hibernate 引用 | 发表时间:2012-11-06 10:50 | 作者:
出处:http://www.iteye.com

 

一、引用查询

日常开发时常会如下的编码规范:“代码中不允许出现sql语句”,其实这里面的意图其实很明显,sql语句混杂在代码之间会破坏代码的可读性和维护性,此时,有人难免失望,那怎么办,难道让我开发到这里,写了这么多的配置文件,突然之间就去换成ibatis???噩梦啊.......

 

其实大可不必,为了符合上述的编码规范,我们通常采用sql配置化的方式,将sql语句保存在配置文件中,需要调用或修改的时候,直接去读取配置就行了。而然,hibernate本身也提供了内置的支持。[注:我想大多数的公司都是会要求写在配置文件中的]

 

我们可以在实体类的配置文件中,通过query节点定义查询的语句,比如你原先想根据姓名查看user表会使用hql的"from User user where user.name=:name",那么我们可以在User.hbm.xml中使用如下配置:

 

<hibernate-mapping>
      <class name="com.entity.User" table="Tuser" batch-size="5">
             //.....其他字段属性定义略
       </class>



        <query name="findByName">
                <![CDATA[
                        from User user where user.name=:name
                    ]]>
         </query>
</hibername-mapping>

 

 

之后,我们即可通过sessio.getNamedQuery方法从配置文件中调用,代码如下:

 

Query query =session.getNamedQuery("findByName");

UserQuery uq=new UserQuery();
uq.setName("Cat");
uq.setAge(new Integer(22));

query.setProperties(uq);

Iterator it = query.iterate();
while(it.hasNext()){
    User user=(User)it.next();
    syso("user.getName()");
}

 

二、联合查询

在sql中,通过join子句实现多表的联合查询,而hibernate的hql则提供了如下的联合查询机制:1、inner join  2、left outer join   3、right outer join     4、full join(不常用);这几种查询分别是与ANSI SQL中所定义的标准链接查询一一对应的。

 

假使我们这有两张表,User和Address表,结构如下:

ID Name
1 Cat
2 Dog
3 Penguin

Address
1 beijing
1 shanghai
2 guangzhou
7 wuhan

结构很简单,就是Cat有两处住址,而Dog有一处住址,Penguin则没有房住

1、Inner Join:

from User user inner join fetch user.address
ID NAME address
1 Cat beijing
1 Cat shanghai
2 Dog guangzhou

 

其中,我们注意到join后还有fetch关键字,该关键字的左右即读出数据后,立即填充到对于的User对象中去,将关联表的字段,填充到自己的属性,即多出现的那一属性栏,address。假使不用fetch的话,得到的结果将不会是个对象,而是存有User对象和Address对象的数组。

 

2、Left outer join:

from User user left join fetch user.address
ID NAME address
1 Cat beijing
1 Cat shanghai
2 Dog guangzhou
3 Penguin <NULL>

由此可见,它的结果是查询所有,左边的表的对应字段的相关数据,左表有几条数据,则查询出几条数据,与之一一对应,假使右表中有对应的数据即查出,没有则以NULL表示。

 

3、Right outer join:

 

顾名思义,我们可以想见,当换做右外连接查询时,将出现Address表所对应的所有数据即对应在User中的相关记录,假使没有,还是用NULL表示。

from User user right join user.address
ID NAME address
1 Cat beijing
1 Cat shanghai
2 Dog guangzhou
<NULL> <NULL> <NULL>

细心的朋友可能会发现,右外连接时,没有了fetch关键字,这是怎么回事呢,其实对于连接查询而言,fetch关键字只是对inner join和left join有效,因为对于right join而言,由于作为关联对象的容器的User对象也可能为空,所以也就无法通过fetch关键字,强制使hibernate进行填充操作,因为当你的User对象也为空时,你在怎么填充,这个User也是空的,也就是相当于一条全空的数据,数据库自然是不允许出现一条空的数据,所以也查不到的。

 

所以这意味着,当我们使用right join的时候,得到结果后,我们将细分出自己所需要的数据,事例代码如下:

String hql="from User user right join user.address";
List list=session.createQuery(hql).list();
Iterator it=list.iterator();
while(it.hasNext()){
    Object[]results=(Object[])it.next();
     User user;
     Address addr;

     if((results[0]!=null)){
          user=(User).result[0];
          syso(user.getName());
      }else{
          syso("No corresoponding user");
      }
     
       addr=(Address)result[1];
       syso(addr.getAddress());
}

 

4、full join:

这个连接并不常用,假如hql还是如下的:from User user full join user.address,那么它将返回两张表记录的笛卡儿交集,即left join和right join的并集

 

5、其他表间查询,最常见的是将两表的数据合并查出,则有这个语句:from User,Address,这种的返回数据并没有太大意义,重复冗余很多,想必平时也没人会用到这种了。

 

好了,这引用查询和连接查询就算完了,希望能帮到大家,下篇打算写个子查询



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibernate 引用] 推荐:

hibernate引用查询和联合查询

- - ITeye博客
日常开发时常会如下的编码规范:“代码中不允许出现sql语句”,其实这里面的意图其实很明显,sql语句混杂在代码之间会破坏代码的可读性和维护性,此时,有人难免失望,那怎么办,难道让我开发到这里,写了这么多的配置文件,突然之间就去换成ibatis. 其实大可不必,为了符合上述的编码规范,我们通常采用sql配置化的方式,将sql语句保存在配置文件中,需要调用或修改的时候,直接去读取配置就行了.

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

Hibernate Lazy属性

- - 博客园_首页
  Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术. 这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录. 通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销. Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

hibernate优化

- - 开源软件 - ITeye博客
原文 http://developer.51cto.com/art/200906/129539.htm. 文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.

JPA & Hibernate 注解

- - CSDN博客编程语言推荐文章
必须,name为可选,对应数据库中一的个表 . 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 . name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 . catalog:可选,表示Catalog名称,默认为Catalog(""). .

hibernate 大对象类型的hibernate映射

- - CSDN博客推荐文章
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应.

JBoss发布Hibernate 4.0

- - InfoQ cn
近日, JBoss发布了流行的对象/关系(O/R)映射框架 Hibernate. Hibernate 4主要的新特性如下所示:. 引入了“Services”API. 提供了更棒的日志,支持 i18n与消息编码(通过JBoss Logging而非 slf4j). 为 OSGi支持做好了准备.

快速上手Hibernate

- - CSDN博客推荐文章
在前面我们已经对Hibernate有所了解,并知道了使用Hibernate的好处,下面就给大家展示一下如何快速使用Hibernate:. 1.下载Hibernate,并解压缩(下载地址: http://www.hibernate.org/downloads). 2.创建一个新的Java项目.   加入数据库驱动(以mysql示例).

Hibernate 二级缓存

- - CSDN博客推荐文章
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了.