HQL(hibernate query language的缩写),它与SQL语法很像,但是它是一个面向对象的查询语言。它的操作对象是类、实例、属性等。当然它也具有面向对象的特征(继承、多态等)。
其中有一个很重要的接口:Query
这个接口的方法设计采用方法链的方式,与jquery的设计方式一样的。例如它里面的setXxx方法返回值也是Query本身,并且它还包括两个方法:1、setFirstResult(int firstResult):设置返回的结果集从第几条记录开始;2、setMaxResult(int maxResult):设置本次查询返回的结果数。
语句分析:
1. from语句
格式:from [className] as [name]
作用:从某个类中挑选出全部实例
注意:类的别名也应该遵循java的命名规则:第一个单词的首字母小写,后面的每个单词的首字母大写。
例子:from Person as p 筛选Person类的所有实例。
2. select语句
格式:select [attr]|[collection] from [className] as [name]
作用:选择指定的属性(存储到指定的集合中)
此外:select还支持字符串连接符、算数运算符及SQL函数,它还支持distinct和all关键字。
例子:
a、 select p.name fromPerson as p
b、 select p.name.firstName from Person as p
c、 select new list(p.name,p.address) from Person as p 将查询内容存储到List的一个对象中。
d、 select new ClassTest(p.name,p.address) from Person as p ClassTest必须有一个以两个字符串为参数的构造函数。
e、 select p.name as personName from Person as p
f、 select new map(p.name as personName) from Person as p 这种情况下以personName为key,将实际选出的值作为value。
g、 select p.name || “ ” || p.assress from Person as p
3. 聚集函数
有五种聚集函数:
a、 avg:计算属性平均值
b、 count;统计选择对象的数量
c、 max:统计属性值的最大值
d、 min:统计属性值的最小值
e、 sum:计算属性值的总和。
例子:select count(*) from Person select max(p.age) from Person as p
4. 多态查询
理解:与java中的多态类似,当我们查询某一个接口的时候,就会自动查询该接口的所有实现类及其子类。
例子:from java.lang.Object o 会查询所有被持久化的对象(在hibernate.cfg.xml中配置过的内容)。
5. where语句
作用:它用于筛选选中的结果,以缩小选择的范围。如果没有为持久化实例另起别名,可以直接使用属性名引用属性。
例子:
a、 from Person where name like “tom%” <=> from Person as p where p.name like “tom%”
b、 from Cat cat where cat.mate.name like “kit%” 被翻译后的SQL语句为:select * from cat_table as cat_table1 as table2 where table1.mate = table2.id and table1.name like “kit%”
c、 from Foo foo where foo.bar.baz.customer.address.city like “jiyuan%” 它翻译成SQL查询语句后,将变成一个四表连接的查询,“=”运算符不仅可以用来属性比较,而且还可以进行实例比较:select cat,mate from Cat cat, Cat mate where cat.mate = mate
d、 from Cat as cat where cat.id = 123 注意:特殊属性(小写)id可以用来表示一个对象的标识符(也可以使用该对象的属性名),该类中可以不定义id这个变量,hibernate会自动将其识别为该类的主键。
e、 from Person as person where person.id.country = ‘AU’ and person.id.medicareNumber = 123456
from Account as account where account.owner.id.country = ‘AU’ and account.owner.id.medicareNumber = 123456
注意:当特殊属性为引用类型(复合主键,例如:成绩表的sno和cno为主键)时,也可以用id作为标识符。
f、 from Cat cat where cat.class = DomesticCat
g、 where子句中的属性表达式必须以基本类型或者java.lang.String结尾
6. 表达式
a、 数学运算符:+=*/等
b、 二进制比较运算符:=、>=、<=、<>、!=、like等
c、 逻辑运算符and、or、not等
d、 in, not in, between, is null, is not null, is empty, is not empty, member of and not member of 等
e、 简单的case, case … when … then … else … end 和 case, case when … then … else … end等。
f、 字符串连接符 value1 || value2 或者使用字符串连接函数concat(value1, value2)。
g、 时间操作函数:current_date(), current_time(), current_timestamp(), second(), minute(), hour(), day(), month(), yeay()等。
h、 HQL还支持EJB-QL3.0所有的函数或操作:subString(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), coalesce() 和 nullif() 等。
i、 还支持数据库的类型转换函数,如cast(… as …),第二个参数是hibernate的类型名,或者extract(… from …),前提是底层数据库支持ANSI cast() 和 extract()。
j、 如果底层数据库支持单行函数:sign(), trunk(), rtrim(), sin()。则HQL语句也完全可以支持。
k、 HQL语句支持用“?”作为参数占位符,这与JDBC的参数占位符一样,也可以使用命名参数站位符号,方法是在参数名前面增加冒号“:”,如::start_date, :x1 等。
l、 也可以字where子句中使用SQL常量,如’foo’,69,’1970-01-04 10:00:01.0’等
m、 还可以再HQL语句中使用java public static final 类型的常量,如:eg.Color.TABBY。
n、 in与between … and 可以这样使用:
from DomesticCat cat where cat.name between ‘A’ and ‘B’
from DomesticCat cat where cat.name in (‘foo’, ‘bar’, ‘baz’)
o、 也支持not in 和 not between … and:
from DomesticCat cat where cat.name not between ‘A’ and ‘B’
from DomesticCat cat where cat.name not in (‘foo’, ‘bar’, ‘baz’)
p、 子句is null 与 is not null可以被用来测试空值
from DomesticCat cat where cat.name is null;
from Person as p where p.address is not null;
如果在hibernate的配置文件中添加<property name=”hibernate.query.substitutions”>true 1, false 0</property>
则可以写这样的HQL:from Cat cat where cat.alive = true
q、 Size关键字用于返回一个集合的大小,例如:
from Cat cat where cat.kittens.size > 0;
from Cat cat where size(cat.kittens) > 0;
r、 对于有序集合,还可以使用minindex 与 maxindex 函数代表最小与最大的索引序数。同理,可以使用minelement 与 maxelement 函数代表集合中最小与最大的元素。例如:
from Calendar cal where maxelement(cal.holidays) > current date;
from Order order where maxindex(order.items) > 100;
from Order order where minelement(order.items) > 1000;
s、 可以使用SQL函数如:any, some, all, exists, in等来操作集合里的元素,例如:
//操作集合元素
select mother from Cat as mother ,Cat as kit where kit in elements(foo.kittens)
//p的name属性等于集合中某个元素的name属性
select p from NameList list, Person p where p.name = some elements(list.names)
//操作集合元素
from Cat cat where exists elements(cat.kittens)
from Player p where 3 > all elements(p.scores)
from Show show where ‘fizard’ in indices(show.acts)
注意:在这些结构变量中:size, elements, indices, minindex, maxindex, maxindex, minelement, maxelement等,只能在where子句中使用
t、 在where子句中,有序集合的元素(arrays, lists, maps)可以通过[]运算符访问。
//items是有序集合属性,items[0]代表第一个元素
from Order order where order.items[0].id = 1234
//holidays 是map集合属性,holidays[national day]是代表其中一个元素
select person from Person person, Calendar calendar where calendar.holiday[‘national day’] = person.birthday and person.nationality.calendar = calendar
//下面同时使用list集合和map集合属性
select item from Item item, Order order where order.items[order.deliveredItemIndices[0]] = item and order.id = 11
select item from Item item, Order order where order.items[maxindex(order.items)] = item and order.id = 11
在【】中的表达式也可以为一个算数表达式,例如:
Select item from Item item, Order order where order.item[size(order.items) - 1] = item
例子:
select cust
from Product prod, Store store inner join store.customers cust
where prod.name = ‘widget’
and store.location.name in (‘Melbourne’, ‘Sydeny’)
and prod = all elements (cust.currentOrder.lineItems)
7. order by子句
查询返回的列表(list),可以根据类或引用属性的任何属性来进行排序,例如:
from Person as p order by p.name, p.age
还可以使用asc和desc关键字指定升序或者降序的排列规则,例如:
from Person as p
order by p.name asc, p.age desc
如果没有指定排序规则时,默认采用升序规则,与是否使用asc关键字没有区别,加上asc是升序,不加asc也是升序。
8. group by子句
利用返回聚集值的查询,可以对持久化类或引用属性的属性进行分组,分组时可使用group by语句,看下面的HQL语句:
select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat,color
类似于SQL的规则,出现在select后的属性要么出现在聚集函数中,要么出现在group by的属性列表中。看下面的示例:
//select 后出现的id处出现在group by之后,而name属性则出现在聚集函数中
select foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.id
having子句用于对分组进行过滤,例如:
select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)
注意:having子句用于对分组进行过滤,因此having子句只能在有group by子句时才可以使用,没有group by子句,则不能使用having子句。
group by子句与order by子句中都不能包含算数表达式。
9. 子查询
如果底层数据库支持子查询,则可以在HQL语句中使用子查询。与SQL中子查询相似的是,HQL中的子查询也需要用”()”括起来。例如:
from Cat as fatcat
where fatcat.weight > (select avg(cat.weight) from DomesticCat cat)
如果select包含多个属性,则应该使用元祖构造符:
from Cat as cat
where not (cat.name, cat.color) in
(
select cat.name, cat.color from DomesticCat cat
)
10. fetch关键字
对于集合属性,hibernate默认采用延迟加载策略。例如,对于持久化类Person,有集合属性scores。加载Person实例时,默认不加载scores属性。如果Session被关闭,则Person实例将无法访问关联的scores属性。
那么我们可以取消延迟加载策略,或者使用fetch join。例如:
from Person as p join p.scores 它将会初始化Person的scores集合属性。
如果使用了属性级别的延迟加载,则可以用fetch all properties来强制hibernate立即抓取那些原本需要延迟加载的属性。例如:
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like ‘%cats%’
11. 命名查询
HQL查询还支持将查询所用的HQL语句放入配置文件中,而不是代码中。通过这种方式,可以大大提高程序的解耦。
例子(在映射文件中定义):
<!—定义命名查询 -->
<query name=”myNamedQuery”>
<!—此处确定命名查询的HQL语句 -->
From Person as p where p.age > ?
</query>
该命名的HQL查询可以直接通过Session访问,调用命名查询的示例代码如下:
Private void findByName() throws Exception
{
//获得Hibernate Session对象
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
System.out.println(“执行命名查询”);
List list = session.getNameQuery(“myNamedQuery”)
//为参数传值,Query setInteger(int position, int val)
.setInteger(0,20)
.list();
//遍历集合结果集
for(Iterator it = p1.iterator(); it.haxNext();)
{
Person p = (Person) it.next();
System.out.println(p.getName());
}
//提交事务
tx.commit();
HibernateUtil.closeSession();
}
发表评论
-
hibernate——多态的体现
2012-06-05 12:24 959Java十分的提倡面向对象,那么我们利用hibernat ... -
struts2官方教程学习总结——拦截器
2012-05-13 09:57 1328拦截器的工作流程: 下面的就是当一个请求到str ... -
struts2中Convention plug-in中的那些事儿
2012-05-10 09:21 2616哈哈,一颗好奇心、一颗永不满足的心让我终于解决了这个问题 ... -
Struts2的启动过程源码分析
2012-05-09 13:14 4176此文重点分析struts启动的时候加载的配置文件信息: ... -
Struts2实现文件上传和下载
2012-05-09 10:40 924当进行文件上传时,表单提交方法必须为Post方法,enc ... -
struts2与json、xml的综合使用
2012-05-09 10:23 956其实,说到这个主题,总觉得没有什么必要总结。因为它与se ... -
struts2中的问题(已解决,链接地址:http://wlzjdm.iteye.com/blog/1521105)
2012-05-08 18:03 958该问题已解决,链接地址:http://wlzjdm.iteye ...
相关推荐
**Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...
在本文中,我们将深入探讨如何使用Hibernate 4框架进行初步的“Hello World”实践。...这只是一个基础,Hibernate还提供了更高级的功能,如查询语言(HQL)、 Criteria API、缓存机制等,等待你去探索和掌握。
使用`Session.get()`或`Session.load()`根据主键获取对象,或者使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)或SQL查询。 3. **更新(Update)** 修改对象的属性,然后...
Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...
Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性和关联等。 #### 二、HQL 的特点 1. **面向对象*...
// 1.查询所有 // 2.条件查询(where、模糊匹配) // 3.范围查询(OR、IN、AND、NOT、>、<、、>=、、...———————————————— 原文链接:https://blog.csdn.net/qq_29001539/article/details/105154689
第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试优先 6.7 容器,session与事务 6.8 ...
总结来说,"struts2+hibernate整合例子——新闻管理系统"是一个典型的Java Web应用示例,展示了如何利用Struts2的MVC模式和Hibernate的ORM能力,实现对新闻数据的CRUD操作及高级查询。这个系统可能包含了Action类、...
- **Query/HQL/Criteria**: 提供了多种查询方式,包括SQL、HQL(Hibernate Query Language)和Criteria API。 ### 3. Hibernate的工作流程 1. 应用程序加载Hibernate配置文件并创建SessionFactory。 2. 通过...
【标题】"7.1.1Hibernate的入门必备——文档和源码"主要涉及的是Java领域的一个重要ORM框架——Hibernate的基础学习。Hibernate是一种用于Java应用的开源对象关系映射(ORM)工具,它允许开发者将Java类与数据库表...
第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R建模还是对象建模 6.3 E-R建模及工具集 6.4 对象建模 6.5 项目的目录组织和基础设施 6.6 测试优先 6.7 容器,session与事务 6.8 ...
现在回到主题——**Hibernate查询缓存**。查询缓存是Hibernate提供的第二级缓存的一部分,用于存储查询结果。它的主要目的是减少对数据库的访问次数,提高应用性能。查询缓存的工作原理是:当执行一次查询后,如果...
`chapter5`关注的是Hibernate的查询语言——HQL(Hibernate Query Language)和Criteria API。HQL是一种面向对象的查询语言,允许开发者用类名和属性名来编写查询,极大地提高了代码的可读性。Criteria API提供了一...
Hibernate 提供了多种查询方式,包括 HQL(Hibernate Query Language)、QBC(Query By Criteria)和 JPA(Java Persistence API)的 Criteria API。这些查询语言提供了面向对象的方式来检索数据,比传统的 SQL 更加...
在Java代码中,我们可以使用`session.createQuery()`创建HQL查询,并通过`query.list()`获取结果列表。需要注意的是,HQL对大小写不敏感,但类名和属性名必须与实际定义一致,因此`from student`会导致错误。 当...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
Hibernate提供了一种面向对象的查询语言——HQL(Hibernate Query Language),类似于SQL但更贴近Java对象。HQL可以方便地进行对象级别的查询,如选择、聚合、关联等操作。 六、 Criteria查询 除了HQL,Hibernate还...
在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...
4. **查询语言HQL和 Criteria API**:介绍Hibernate查询语言HQL,它是面向对象的查询方式,与SQL相对应,同时讲解Criteria API,提供更动态、类型安全的查询方式。 5. ** Criteria和DetachedCriteria**:详细阐述...
3. 查询语言(HQL):Hibernate 提供了自己的SQL方言——HQL,用于更面向对象的查询。手册会展示如何编写HQL查询,包括基本查询、条件查询、分组和排序等。 4. Criteria查询:提供了一种基于对象的查询方式,比HQL...