hibernate的hql查询

时间:2023-03-08 20:18:55

1.概念介绍

1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句。

2.HQL是Hibernate Query Language的简写,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,更加面向对象的封装,更加灵活,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式

它的书写形式和sql几乎一样,下面就来体会下

2.单表查询

针对一个表的查询, from A  , hibernate会把A翻译为对相应的实体

2.1获取对象的所有属性: 

String hql="from User u where u.userID=?"
它的的返回形式是一个user对象

2.2获取对象的一个属性:

 String hql="select u.name from User u where u.userID = ?";

它的返回形式是: List<String> users,  属性是String类型, 因此List的泛型,会自动封装为属性的类型

2.3获取部分属性,返回对象

第一步: 在User实体中,添加构造函数

public User(Integer age, String name) {} 

第二步: 写hql

String hql = "select new User ( u.name,u.age ) from User u where u.userID > ?";

通过new的方式,可以达到目的,它的返回形式是: List<User> users

3.关联表查询: 关联的是id

下面是one2one和one2many的例子

 3.1 One2One

user和order是一对一的关系,User实体类中有属性 Order order

以User的id为条件查

String hql="from User u left join u.order o where u.id>?";

1.left join u.order  , 没有on 关键字, sql 翻译自动为关联u.xxx left out join o.id

2.with关键字 相当于sql中的on

3.它的返回形式是:List<Object[]> 对象数组的集合, 每一个数组有两个元素,即 object[]{user,order}

以Order的id为条件查

String hql="from User u where u.order.id>?";

u.order.id  是hibernate关联对象间的导航特性

现在我需求是, 既然order是User的一个属性, 我想把Order封装在User中,即object[]{user}

hql的变化有三点: select u ;  加入fetch 关键字; 为了防止有重复数据,加入disrinct关键字

 String hql="select distinct u from User u left join fetch u.orders where u.id>?";

它的返回形式是:List<Object[]> 对象数组的集合, 数组的数据机构是 :  object[]{user},通过getOrders()获取关联的对象

distinct和fecch有这么神奇的效果,看了下面的分析,肯定明白

查询出的数据如下,只展示id,其余数据省略
UserId OrderID  
1 1  
1 2  
对上面的数据它是如何封装的呢?
1>第一行数据 : 用户id为1
第一步: User user = new User();存取用户信息。
第二步: Order order1=new Order(),存取order信息,并将order1, user.setOrders(...)
第三部: 将user存入List<User> users, users.add(user) 2>第二行数据 : 用户id依然为1
第一步: 发现用户id未改变,,则继续使用user.
第二步: 订单id改变,则 Order order2 = new Order(),存取order信息,并将order2存入user.
这个时候,同一个user拥有的两个order
第三步: 将user存入List<User> users, users.add(user1); 3>最终: List<User> users;

3.2 one2many

user和order是一对多的关系,User实体类中有属性 Set<Order> orders

Ordre实体中有关系属性: User user

以orders的id为条件去查

String hql="from User u left join u.orders o  where o.id>?";

注意:

必须left join u.orders,这是显示连接 orders ,  这是和one2one不同之处

4.关联表查询: 关联的是普通属性

A表中有xx字段, B表中也有xx字段

 string hql = "select  a from  A a  ,B b  where a.xx=b.xx"; 

5.子查询

Order中的属性: Long userId , 是 User的 逻辑外键

String hql="from User u where u.id >"
      + "(select o.userId from Order o where o.id =1)";

子查询必须放在where关键字后面,必须用()括起来

原因: from字句中的实体对象,必须在Hibernate配置文件中有明确的配置