`

hibernate引用查询和联合查询

阅读更多

 

一、引用查询

日常开发时常会如下的编码规范:“代码中不允许出现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
user_id address
1 beijing
1 shanghai
2 guangzhou
6 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
0
分享到:
评论

相关推荐

    全面解读hibernate关联关系

    映射一对多关联关系 以Customer和Order为例: 一对多: 每个Customer可以有一个或者多个Order,因此Customer中应该有一个集合类型的属性,来引用所有关联的Order对象。 多对一。全实例讲解

    Hibernate+中文文档

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...

    HibernateAPI中文版.chm

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...

    hibernate3.2中文文档(chm格式)

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...

    Hibernate注解映射联合主键

    该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注解为@Id ...

    hibernate 教程

    值集合和多对多关联(Collections of Values and Many-To-Many Associations) 6.4. 一对多关联(One-To-Many Associations) 6.5. 延迟初始化(延迟加载)(Lazy Initialization) 6.6. 集合排序(Sorted ...

    Hibernate 中文 html 帮助文档

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.4.1. 别名和属性引用(Alias and property references) 16.1.5. 返回非受管实体...

    Hibernate中文详细学习文档

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...

    最全Hibernate 参考文档

    15.8. 离线(detached)查询和子查询 16. Native SQL查询 16.1. 创建一个基于SQL的Query 16.2. 别名和属性引用 16.3. 命名SQL查询 16.3.1. 使用return-property来明确地指定字段/别名 16.3.2. 使用存储过程来查询 16.3...

    Hibernate中文API大全

    当然,当你定义Item时,你无法引用这些purchase,因此你无法实现双向关联查询。记住组件是值类型,并且不允许共享引用。某一个特定的Purchase 可以放在Order的集合中,但它不能同时被Item所引用。 其实组合元素的...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    hibernate 体系结构与配置 参考文档(html)

    离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.2. 别名和属性引用 16.3. 命名SQL查询 16.3.1. 使用return-property来明确地...

    Hibernate教程

    16.8. 离线(detached)查询和子查询 17. Native SQL查询 17.1. 创建一个基于SQL的Query 17.2. 别名和属性引用 17.3. 命名SQL查询 17.3.1. 使用return-property来明确地指定字段/别名 17.3.2. 使用存储过程来查询...

    hibernate简介及优缺点

    1.Hibernate持久化类:Hibernate的持久化类是一个JavaBean(pojo+相应属性的getter和setter方法),该JavaBean最好实现java.io.Serializable接口 2.Hibernate映射文件:Hibernate映射文件是Hibernate与数据库进行持久化...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...

    hibernate

    值集合和多对多关联(Collections of Values and Many-To-Many Associations) 6.4. 一对多关联(One-To-Many Associations) 6.5. 延迟初始化(延迟加载)(Lazy Initialization) 6.6. 集合排序(Sorted ...

    Hibernate 课件_HQL

    我培训时用的 Hibernate 课件, 个人能力范围内精心整理,图文并茂.希望能对大家学习 Hibernate 提供帮助....引用查询;联合查询;子查询;数据加载方式;Sql 查询;分页查询;管理 Session;ThreadLocal 接口的使用

    Hibernate注解

    通常和联合起来使用。 * 例:@Id * @GeneratedValue(generator = "idGenerator") * @GenericGenerator(name = "idGenerator", strategy = "foreign", * parameters = { @Parameter(name = "property", value = ...

Global site tag (gtag.js) - Google Analytics