- 浏览: 502669 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
提供的检索方式: 1、简介 1.1 HQL检索方式 //创建一个Query 对象 1.2 QBC检索方式 QBC提供的查询方式由:Criteria接口,Criterion接口和Expression类组成,支持在运行时动态生成查询语句。 1.3 SQL检索方式 HQL和QBC检索时,Hibernate会生成标准的SQL查询语句,适用于所有的数据库平台,这两种方式都是跨平台的。 1.4 .... 1.5 适用别名 from Customer as c where c.name=:name 1.6 多态查询 HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例, 1.7 对查询结果排序 HQL采用 order by ,QBC采用Order类对结果排序 1.8 分页查询 Query和Criteria接口都提供了用于分页显示查询结果的方法 1.9 检索单个对象 Query和Criteria接口都提供了以下用于执行查询语句并返回查询结果的方法。 Hibernate参数机制依赖于JDBC API中的PreparedStatement的预定义SQL语句功能。优点: 1.10.1 参数绑定的形式 1.10.2 绑定各种类型的参数 -->setProperties()方法:用于把命名参数与一个对象的属性值绑定 1.11 在映射文件中定义命名查询语句 <hibernate-mapping> <query name="findCustomersByName"><![CDATA[ 2、设定查询条件 HQL查询通过where子句来设定查询条件,注意的是 from Customer c where c.name ='tom',注意的是,在where子句中给出的是对象的属性名,而不是字段名. 2.1 比较运算 2.2 范围运算 in、between ... and ...、等 2.3 字符串模式匹配 通配符: 2.4 逻辑运算 3、连接查询 和SQL查询一样,HQL与QBC也支持各种各样的连接查询,如内连接、外连接和交叉连接,HQL和QBC还支持迫切内连接和迫切左外连接。 迫切左外连接和迫切内连接不仅指定了连接查询方式,而且显式指定了关联级别的检索策略。 3.1 默认情况下关联级别的运行时检索策略 3.2 迫切左外连接 ----会采取迫切左外连接检索策略---- //HQL //QBC检索方式 3.3 左外连接 //HQL 根据映射文件来决定orders集合的检索策略 注:返回结果中与迫切左外连接的不同,迫切左外连接,返回customer,这里返回是对象数组(一行数据拆成了两个对象) 如果希望返回的集合中仅包含Customer对象,可以在HQL查询语句中使用select关键字: 3.4 内连接 同样可以设定select 关键字来使得之返回Customer对象。 另:等价于 默认情况下,QBC只检索出Customer对象,以上代码等价于H 3.5 迫切内连接 session.createQuery("from Customer c inner join fetch c.orders o where c.name like 'T%'"); 如果包含重复元素也可以用HashSet来过滤。 注: QBC不支持迫切内连接 3.6 隐式内连接 HQL: QBC: 3.7 右外连接 3.8 使用SQL风格的交叉连接和隐式内连接 HQL支持SQL风格的交叉连接查询,eg: HQL内连接查询语句: 总结:
(1)导航对象图检索方式
(2)OID检索方式
(3)HQL检索方式
(4)QBC检索方式[query by Criteria(标准)]
(5)本地SQL检索方式
HQL(Hibernate query Language)是面向对象的查询语言,在Hibernate提供的检索方式中,HQL是使用最广泛的检索方式。功能:
a.在查询语句中设定各种查询条件
b.支持投影查询,即仅检索出对象的部分属性
c. 支持分页查询
d.支持连接查询
e.支持分组查询,允许使用having 和group by 关键字
f.提供内聚聚集函数,如sum(),min()和max()
g.支持子查询,即嵌入式查询
h.支持动态帮定参数
session的find方法以及Query 接口都是支持HQL检索方式的,这两者的区别在于,前者只是执行一些简单的HQL查询语句的便捷方式,它不具有动态邦定参数的功能,Query 接口才是真正的HQL查询接口。
Query query = session.createQuery ("from Customer as c where c.name=:customerName and c.age=:customerAge");
//动态绑定参数
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
//执行查询语句,返回结果
List result = query.list();
//创建一个 Criteria对象
Criteria criteria = session.ceateCriteria(Customer.class);
//设定查询条件,然后把查询条件加入到Criteria中
Criterion criterion1 = Exception.like("name","T%");
Criterion criterion2 = Exception.eq("age",new Integer(21));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
//执行查询语句,返回查询结果
List result = criteria.list();
QBE(Quary by Example)检索方式,是QBC的子功能。它允许先创建一个对象样板,然后检索出所有和这个样板相同的对象。
//创建一个Customer样板对象
Customer example = new Customer();
example.setAge(21);
List result = session.createCriteria(Customer.class)
.add(Example.create(example0)
.list();
有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句,这样可以利用SQL查询方式。
Query query = session.createSQLQuery("select {c.*} from CUSTOMERS c where c.NAME like :customerName and c.AGE = :customerAge ","c",Customer.class);
query.setString("customerName","T%");
query.setInteger("customerAge",21);
List result = query.list();
= from Customer c where c.name=:name
session.createQuery("from Employee"); or session.createCriteria(Employee.class);
如果Employee类有两个子类:HourlyEmployee和SalariedEmployee,那么这个查询语句会查出所有的Employee实例,以及HourlyEmployee类和SalariedEmployee类的实例。
session.createQuery("from HourlyEmployee");
session.createCriteria(HourlyEmployee.class);//只检索子类
//HQL
Query query = session.createQuery("from Customer c order by c.name");
//QBC
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
a.setFirstResult(int firstResult): 开始索引位置(从0开始)
b.setMaxResult(int maxResults):一次最多检索出的对象数目
a. list方法:返回一个list类型的查询结果(setMaxResult(1)即返回单个对象)
b. uniqueResult()方法:返回单个对象
1.10 在HQL查询语句中绑定参数
a. 非常安全,
b.能够利用底层数据库预编译SQL语句的功能,提高查询数据的性能。预编译是指底层数据库系统只需编译SQL语句一次,把编译出来的可执行代码保存在缓存中,如果多次执行相同形式的SQL语句,不需要重新编译,只需要从缓存中获得执行代码即可。(而如果使用条件拼sql会每次都重新编译。)
a.按照参数名字绑定,命名参数以":"开头。eg:c.name=:name
b.按照参数位置绑定,用?来定义参数的位置。eg:c.name=?
按名字绑定的优势:
a. 使程序代码有较好的可读性
b.按名字绑定有利于程序代码的维护,而对于按位置绑定方式,如果参数在HQL查询语句中的位置改变了,就必须修改相关帮定参数的代码,这削弱了程序代码的健壮性和可维护性。
c. 按名字绑定方式允许一个参数在HQL查询语句中出现多次。
a.setXxxxx(),如:setInteger();
b.三个特殊的参数绑定方法
-->setEntity():把参数与一个持久化类的实例绑定,主要是用其中的OID进行查询
session.createQuery("from Order o where o.customer= :customer")
.setEntity("customer",customer)
.list();
对应的SQL:
select * from ORDERS where CUSTOMER_ID=1;
-->setParameter()方法:绑定任意类型的参数
query.setParameter("customer",customer,Hibernate.entity(Customer.class));
query.setParameter("orderNumber",orderNumber,HIbernate.STRING);
//某些类型Hibernate可以根据参数值的java类型推断出对应的映射类型,此时不需要显示指定一个摄类型
query.setParameter("orderNumber",orderNumber);
但是日期类型的一般要指定,因为有好几种可能
Customer customer = new Customer();
customer.setName("Tom");
customer.setAge(21);
Query query = session.createQuery("from Customer as c where c.name=:name and c.age=:age");
query.setProperties(customer);
:name 会和Customer对象的name属性匹配。
<class name="mypack.Customer" table="CUSTOMERS">
...
</class>
from Customer c where c.name like :name
]]></query>
</hibernate-mapping>
<query>元素用于定义一个HQL查询语句,他和<class>元素并列,程序中使用方式:
Query query = session.getNameOfQuery("findCustomersByName");
query.setString("name",name);
List result = query.list();
<query>元素也可以用于定义一个本地SQL语句
对于QBC查询,必须创建一个Criterion对象来设定查询条件,Expression类提供了创建Criterion实例的工厂方法。
%:匹配任意类型并且任意长度(可以=0)的字符串,如果是中文,需要两个百分号,即"%%"
_:匹配单个任意字符,常用来限制字符串的表达式长度。
Query query = session.createQuery("from Customer c left join fetch c.orders o where c.name like 'T%'");
List result = query.list();
List result = session.createCriteria(Customer.class)
.setFetchMode("orders",FetchMode.EAGER)
.add(Expression.like("name","T",MatchMode.START))
.list();
HQL:left join fetch 关键字表示迫切左外连接检索策略。
QBC:FetchMode.EAGER表示迫切左外连接检索策略。所有的orders集合都被初始化,且返回的Customer对象集合中可能有重复的元素,可以使用HashSet来过滤:
HashSet set = new HashSet(result);
Query query = session.createQuery("from Customer c left join c.orders o where c.name like 'T%'");
List result = query.list();
for(Iterator pairs = result.iterator();pairs.hasNext();){
Object[] pars = (Object[])pairs.next();
Customer customer = (Customer)pairs[0];
Order order =(Order)pairs[1];
}
session.createQuery("select c from Customer c left join c.orders o where c.name like 'T%'");
但初始化orders的时间由映射文件决定
QBC也支持内连接查询:
Criteria customerCriteria = session.createCriteria(Customer.class);
customerCriteria.add(Expression.like("name","T",MatchMode.START));
Criteria orderCriteria = customerCriteria.create(Criteria("orders"));
orderCriteria.add(Expression.like("orderNumber","T",MatchMode.START));
List result = orderCriteria.list();
List result = session.createCriteria(Customer.class)
.createAlias("orders","o")
.add(Expression.like("this.name","T",MatchMode.START)//Customer的默认别名=this
.add(Expression.like("o.orderNumber","T",MatchMode.START))
.list();
===>select c from Customer c join c.orders o where c.name like 'T%' and o.orderNumber like 'T%'
通过o.customer.name的形式访问与Order关联的Customer对象的name属性
from Order o where o.customer.name like 'T%'
以上代码虽然没有使用join关键字,它隐式指明使用内连接查询,他和一下HQL查询语句等价:
from Order o join o.customer c where c.name like 'T%'
不支持隐式内连接,必须显式指定
from Customer,Order
这个SQL执行交叉连接查询,将返回CUSTOMERS表与ORDERS表的交叉组合。(n*m条结果)
from Customer c inner join c.orders ;
如果Customer没有orders集合属性,可以采用SQL风格的隐式内连接查询语句:
from Customer c ,Order o where c.id = o.customer_id
3.9 关联级别运行时的检索策略
(1)如果在HQL或QBC程序代码中没有显示指定检索策略,将使用映射文件配置的检索策略,但有个例外,即HQL总是忽略映射文件中设置的迫切左外连接检索策略。也就是说,及时映射文件中设置了迫切左外连接检索策略,如果HQL查询语句中没有显示指定这种策略,那么HQL仍然采用立即检索策略。
(2)如果在HQL或QBC程序代码中显示指定了检索策略,就会覆盖映射文件配置的检索策略。
在HQL查询语句中显示指定的检索策略包括以下内容:
a. left join fetch
b. inner join fetch
QBC中FetchMode类的三个静态实例,指定检索策略
a.FetchMode.DEFAULT:默认值,采用映射文件中配置的检索策略。
b.FetchMode.EAGER:迫切左外连接
c. FetchMode.LAZY:显示指定延迟检索。(HQL中没有提供该功能)
(3)只允许在一个sql语句中迫切左连接检索一个集合(一对多或多对多关联),允许在一个查询语句中迫切左连接检索多个一对一关联或着多对一关联
(4)HQL支持的各种连接查询
发表评论
-
Hibernate:Envers 审计
2018-09-17 23:57 531https://blog.csdn.net/Silen ... -
【转】Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
2016-12-13 15:07 703http://www.cnblogs.com/hoojo ... -
【转】Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
2016-12-13 15:05 768http://www.cnblogs.com/hoojo ... -
Hibernate中的三种对象状态:
2015-11-15 18:33 416Hibernate中的三种对象状态: 1.瞬时(tr ... -
【转】Hibernate过滤器使用窍门
2015-09-08 17:13 553Hibernate过滤器(filter)是全局有效的 ... -
【转】Hibernate left join(左连接)
2015-08-26 17:27 1995如果是内连接的多表查询可以不用join关键字,在where ... -
【转】Hibernate 所有缓存机制详解
2015-08-26 14:50 655hibernate提供的一级缓存 hibernate是一个 ... -
【转】Hibernate中session的clear(),flush(),evict()方法详解
2015-08-26 14:22 10461.Clear 方法 无论是Load 还是 Get ... -
object references an unsaved transient instance - save the transient instance be
2015-04-15 10:17 912在做hibernate保存时出现异常object refer ... -
【转】An association from the table * refers to an unmapped class: *
2015-04-08 10:13 962解决方法:class路径没写正确。有三个地方需要注意1、< ... -
hibernate映射文件one-to-one 元素属性(转)
2013-01-07 19:13 835one-to-one 元素 属性: name:映射类 ... -
【转】Hibernate中重要对象的详解
2012-12-13 14:18 674★→→SessionFactory (org.hibernat ... -
【转】很详细的spirng+struts+hibernate实例
2012-12-13 14:17 2379本文并不想介绍Struts,Spring,Hiber ... -
【转】Hibernate中id标签
2012-11-19 14:32 846核心提示:Hibernate中,id标签下的可选gener ... -
【转】hibernate动态创建表,修改表字段
2012-10-22 18:50 1053我们知道,hibernate的tool工具中有个包hbm2dd ... -
【转】hibernate many-to-one(多对一)及 cascade(级联)
2012-09-19 16:18 804Model public class User { // ... -
报错:使用hibernate字符串超长
2012-09-13 17:47 1578在使用varchar2类型时必须指定其长度(最小1字节 ... -
包名不同的同名类的hibernate冲突
2012-09-13 14:38 1217在实际开发中,在有类a.b.c.POClass和a.b.c ... -
【转】hibernate自定义类型部分接口详解--用户自定义类型
2012-08-31 16:48 0UserType public interface Us ... -
ORA-00904: "THIS_"."C_UNIT": 标识符无效
2012-08-02 13:40 1577hibernate could not resolve pro ...
相关推荐
HQL 查询语言基础知识 HQL(Hibernate Query Language)是一种面向对象的查询语言,用于在 Hibernate 框架中查询数据库。HQL 查询语言基础知识是 Hibernate 中的基础组件之一,对于开发人员来说,掌握 HQL 查询语言...
通过本文的介绍,我们不仅回顾了数据库表连接的基础知识,还深入了解了Hibernate HQL关联查询的实现原理及应用方法。对于开发者而言,掌握HQL关联查询不仅可以提高查询效率,还能让代码更加简洁易懂。希望本文能帮助...
以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...
本教程将深入探讨HQL的基础知识,包括插入、查询和更新操作,并提供相关代码示例。 1. **HQL简介** HQL是Hibernate的核心组成部分,允许开发者以面向对象的方式来执行数据库查询。与SQL不同,HQL基于对象,而不是...
接下来将详细介绍HQL的相关知识点。 ### HQL概述 HQL是Hibernate框架中用于执行数据库操作的一种面向对象的查询语言。与传统的SQL语言不同,HQL更加注重于面向对象的特性,它支持Java类名和属性名作为查询条件,...
### HQL连接查询和注解使用总结 #### HQL连接查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种更自然的方式查询对象,而不是直接查询底层数据库表。HQL支持多种连接查询...
以下是 Hibernate HQL 查询语句的知识点总结: 1. 实体查询: * 使用 HQL 语句可以查询出实体对象所对应的所有数据,并将数据封装成实体对象。 * HQL 语句可以使用 where 字句,并可以在 where 字句中使用各种...
### HQL语句查询知识点详解 #### 一、HQL简介 HQL(Hibernate Query Language)是Hibernate框架中用于查询数据的一种语言。它类似于SQL,但面向对象特性更明显,可以更加灵活地处理复杂的对象图关系。HQL支持基本的...
本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query Language)查询以及在线查询和离线查询的概念。 首先,我们来详细讨论`Session`对象。在Hibernate中,`Session`是应用程序与数据库之间的...
### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询...以上就是关于 HQL 中实体查询的相关知识点总结,希望能够帮助开发者更好地理解和应用 HQL 查询语言。
### HQL实用技术知识点概述 ...通过对以上知识点的学习,可以深入理解HQL在处理不同场景下的应用技巧,特别是关联关系的配置和HQL查询的使用。这些知识不仅有助于提高软件开发的效率,还能提升系统的健壮性和可维护性。
### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。
HQL查询语言基础知识 HQL(Hibernate Query Language)是一种面向对象的查询语言,建立在面向对象的基础上。它提供了类SQL查询的功能,但查询目标是对象,而不是记录。HQL 拥有面向对象语言的所有特性,包括多态、...
这个压缩包文件“hql练习之种树.zip”显然与数据库查询语言Hibernate Query Language(HQL)有关,同时结合了“种树”的概念,这通常指的是数据结构中的树形结构或者图算法。在IT领域,种树可能是指在数据库或程序中...
HQL(Hibernate Query Language)是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它是SQL的面向对象版本,使得开发者可以更方便地在Java应用中进行数据库查询。本教程将深入讲解HQL的基础语句,包括ID...
在本篇文章中,我们将深入探讨HQL的基础知识、语法特性以及一些高级用法。 ### HQL基础 1. **基本查询语句**: HQL的基本查询结构与SQL类似,包括`SELECT`, `FROM`, `WHERE`子句。例如,查询所有`User`对象: ``...
HQL 语句是一种类似 SQL 的查询语言,用于定义查询条件和检索数据,而 Criteria API 则是一种基于对象的查询接口,用于构建查询条件和检索数据。 在本笔记中,我们将学习如何使用 Hibernate 的 Criteria API 进行...
根据提供的标题、描述以及部分内文,我们可以提炼出与HQL(Hibernate Query Language)相关的多个重要知识点。HQL是一种面向对象的查询语言,用于在Hibernate框架中执行数据库操作。下面将详细阐述这些知识点: ###...
### Hibernate数据检索(HQL)知识点详解 #### 一、简介 Hibernate 是一款开源的对象关系映射(ORM)框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。本文档基于...
**Hibernate HQL 全攻略** ...以上内容覆盖了HQL的大部分核心特性,通过熟练掌握这些知识点,可以高效地在Hibernate中进行数据查询和操作。学习并实践这些HQL技巧,将极大地提升你在Java持久层开发中的能力。