一、引用查询
日常开发时常会如下的编码规范:“代码中不允许出现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,这种的返回数据并没有太大意义,重复冗余很多,想必平时也没人会用到这种了。
好了,这引用查询和连接查询就算完了,希望能帮到大家
分享到:
相关推荐
此外,不是所有的数据库操作都可以通过这种方式转换,特别是涉及到多表关联和复杂的业务逻辑时。 总的来说,尽管Hibernate在某些复杂的查询场景下可能不如原生SQL灵活,但它提供了多种方式来适应不同的需求。对于子...
虽然外键方式的一对一关联提供了方便的数据操作,但可能会增加数据库的复杂性和查询的性能开销。特别是在级联操作时,需要注意避免不必要的数据库操作,以优化性能。 综上所述,基于外键的一对一关联在Hibernate中...
这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...
在Hibernate中,这种关系需要通过中间表(也称为关联表或连接表)来实现,它通常包含两个外键,分别引用两个参与关联的实体。 二、配置多对多关联 1. 实体类标注 在Java实体类中,我们需要使用`@ManyToMany`注解来...
在Hibernate中,这需要通过一个中间表(也称为关联表或连接表)来实现,对应的注解是@ManyToMany,同时需要定义@JoinTable,包括joinColumns和inverseJoinColumns来指定双方的引用。 在"HibernateSelect"这个文件名...
同样,通过Hibernate查询,我们可以轻松获取员工及其关联的部门信息。 ```java Employee employee = (Employee) session.get(Employee.class, 1); System.out.println("Employee: " + employee.getName()); System...
在实际开发中,理解并熟练掌握Hibernate的查询机制,特别是对于多对多关系和多表查询的处理,能够提高代码的可读性和数据库操作的效率。通过HQL,开发者可以更专注于业务逻辑,而不是底层的SQL语句,从而简化开发...
本篇文章将聚焦于Hibernate中的多对多查询,这是一个复杂但常见的数据关联问题。 首先,我们需要理解关系数据库中的多对多关系。在现实生活中,很多关系都呈现出多对多的特性,例如学生与课程之间的关系,一个学生...
Hibernate允许在查询中处理一对多、多对一、多对多等关联关系。例如,如果User类有一个Address类的属性,可以通过以下方式查询用户及其地址: ```java List<User> users = session.createQuery("from User u left...
这样,Hibernate就能自动处理数据的保存、更新和查询。 接下来讨论"student与class的多对一"关系。在教育系统中,一个班级(class)可以包含多个学生(student),而每个学生只属于一个班级,这就是典型的多对一...
2. **对象导航查询**:利用对象间的关联关系,通过已知对象的引用去获取相关联的对象。 3. **HQL(Hibernate Query Language)查询**:这是一种面向对象的查询语言,类似于SQL,但更符合面向对象的思维方式。HQL...
在 Hibernate 中,关联对象的加载策略有懒加载和立即加载两种。默认情况下,关联对象是懒加载的,即只有在真正访问关联对象时才会触发 SQL 查询。通过 @ManyToOne 和 @OneToMany 的 fetch 属性可以设置为 FetchType....
本地查询是在Hibernate配置文件中预先定义的HQL或Criteria查询,然后在代码中通过名字引用它们。这种方式提高了代码的可读性和复用性。 **9. 性能优化** 在处理大量数据时,考虑使用分页查询以提高性能: ```java...
在Java Persistence API (JPA) 和 Hibernate 框架中,实体之间的关联关系是数据模型的重要组成部分。关联关系允许我们定义不同实体类之间的联系,如一对一、一对多、多对一和多对多。本文将重点讨论其中的一对多和多...
XML映射文件中包含了实体的属性、关联和其他元数据。 通过这些实例,开发者可以学习到如何在实际项目中应用Hibernate,理解其核心机制,并提高数据库操作的效率。熟悉这些映射方式对于开发复杂的Java应用至关重要,...
1. **Hibernate核心库**:Hibernate的核心库是整个框架的基础,它提供了ORM的主要实现,包括实体管理、会话管理和查询语言。主要的类如`SessionFactory`、`Session`和`Query`等都在这个库中定义,它们负责创建数据库...
**HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及关联关系的查询。 ##### 默认数据库表和数据 在本文档...
1. 设置关联字段为null:对于多对一和一对一关系,将引用对象设为null,Hibernate会在持久化时自动删除关联。 2. 使用CascadeType:通过设置CascadeType,可以在一个实体被删除或更新时,自动处理相关联的实体。例如...
本篇将深入探讨Hibernate的四种主要关联关系:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),并结合实例来阐述每种关系的配置和使用。 1. **一对一关联(OneToOne)** 一...
Hibernate 3.x 版本是其成熟且广泛使用的版本,提供了丰富的功能和优化,包括对象的持久化、查询语言HQL以及关联映射。本示例将深入探讨 Hibernate 3.x 中的关联映射,以帮助开发者更好地理解和应用这一关键技术。 ...