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配置文件中有明确的配置

hibernate的hql查询的更多相关文章

  1. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  2. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  3. Hibernate 的hql查询简介【申明:来源于网络】

    Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...

  4. hibernate的hql查询语句总结

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  5. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  6. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  7. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  8. Hibernate之HQL查询的一些例子

    Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...

  9. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

随机推荐

  1. js对已经对象类型进行类型辨别

    typeof() Object.prototype.toString.call(data)

  2. 三星s4宣传片配色有惊喜

    三星s4宣传片配色有惊喜据了解,一周前,三星曾对外发布了新旗舰手机galaxy s4的宣传视频,不过那份视频里所含信息仅仅只有s4发布会的邀请函.而日前,三星官方发布了s4的第二弹宣传片则暗示该机在配 ...

  3. POJ1270 Following Orders[拓扑排序所有方案 Kahn]

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4885   Accepted: 1973 ...

  4. 第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

    9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次 (1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400) 参数 ...

  5. marquee标签、插入百度地图

    marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee标记不仅可以移动文字,也可以移动图片,表格等. 语法:<marquee>... ...

  6. JavaScript(DOM操作)(Window.document对象)

    一.找到元素: docunment.getElementById("id"):                      根据id找,最多找一个: var a =docunment ...

  7. qau-国庆七天乐——A

    A - Who's in the Middle //先吐槽一波vj,不知道怎么回事,bits/stdc++.h不能用了...坑爹 7225007 upstar A Compile Error     ...

  8. vijos1334 NASA的食物计划(二维费用的背包问题)

    背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...

  9. python画柱状图并且输出到html文件

    import matplotlibmatplotlib.use('Agg')import matplotlib.pyplot as pltfrom Cstring import StringIO y ...

  10. EEG: electrode positions & Broadmann atlas

    Source: http://www.brainm.com/software/pubs/dg/BA_10-20_ROI_Talairach/nearesteeg.htm   Area LEFT RIG ...