`
wlzjdm
  • 浏览: 26490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的查询——HQL

 
阅读更多

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使用——入门

    **Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...

    Hibernate 4——Hello World

    在本文中,我们将深入探讨如何使用Hibernate 4框架进行初步的“Hello World”实践。...这只是一个基础,Hibernate还提供了更高级的功能,如查询语言(HQL)、 Criteria API、缓存机制等,等待你去探索和掌握。

    Hibernate总结——课程管理

    使用`Session.get()`或`Session.load()`根据主键获取对象,或者使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)或SQL查询。 3. **更新(Update)** 修改对象的属性,然后...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    Hibernate HQL查询.docx

    Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性和关联等。 #### 二、HQL 的特点 1. **面向对象*...

    Hibernate_HQL案例.zip

    // 1.查询所有 // 2.条件查询(where、模糊匹配) // 3.范围查询(OR、IN、AND、NOT、&gt;、&lt;、、&gt;=、、...———————————————— 原文链接:https://blog.csdn.net/qq_29001539/article/details/105154689

    深入浅出Hibernate中文版 part1

    第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整合例子——新闻管理系统

    总结来说,"struts2+hibernate整合例子——新闻管理系统"是一个典型的Java Web应用示例,展示了如何利用Struts2的MVC模式和Hibernate的ORM能力,实现对新闻数据的CRUD操作及高级查询。这个系统可能包含了Action类、...

    Hibernate——符合Java习惯的关系数据库持久化

    - **Query/HQL/Criteria**: 提供了多种查询方式,包括SQL、HQL(Hibernate Query Language)和Criteria API。 ### 3. Hibernate的工作流程 1. 应用程序加载Hibernate配置文件并创建SessionFactory。 2. 通过...

    7.1.1Hibernate的入门必备——文档和源码

    【标题】"7.1.1Hibernate的入门必备——文档和源码"主要涉及的是Java领域的一个重要ORM框架——Hibernate的基础学习。Hibernate是一种用于Java应用的开源对象关系映射(ORM)工具,它允许开发者将Java类与数据库表...

    深入浅出Hibernate中文版 part2

    第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查询缓存1

    现在回到主题——**Hibernate查询缓存**。查询缓存是Hibernate提供的第二级缓存的一部分,用于存储查询结果。它的主要目的是减少对数据库的访问次数,提高应用性能。查询缓存的工作原理是:当执行一次查询后,如果...

    孙卫琴hibernate source code2

    `chapter5`关注的是Hibernate的查询语言——HQL(Hibernate Query Language)和Criteria API。HQL是一种面向对象的查询语言,允许开发者用类名和属性名来编写查询,极大地提高了代码的可读性。Criteria API提供了一...

    hibernate映射和查询

    Hibernate 提供了多种查询方式,包括 HQL(Hibernate Query Language)、QBC(Query By Criteria)和 JPA(Java Persistence API)的 Criteria API。这些查询语言提供了面向对象的方式来检索数据,比传统的 SQL 更加...

    hibernate查询集合.pdf

    在Java代码中,我们可以使用`session.createQuery()`创建HQL查询,并通过`query.list()`获取结果列表。需要注意的是,HQL对大小写不敏感,但类名和属性名必须与实际定义一致,因此`from student`会导致错误。 当...

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    hibernate3.6.10final官方文档

    Hibernate提供了一种面向对象的查询语言——HQL(Hibernate Query Language),类似于SQL但更贴近Java对象。HQL可以方便地进行对象级别的查询,如选择、聚合、关联等操作。 六、 Criteria查询 除了HQL,Hibernate还...

    Hibernate_NSQL&HQL增删改操作

    在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...

    hibernate in action 中文版书籍

    4. **查询语言HQL和 Criteria API**:介绍Hibernate查询语言HQL,它是面向对象的查询方式,与SQL相对应,同时讲解Criteria API,提供更动态、类型安全的查询方式。 5. ** Criteria和DetachedCriteria**:详细阐述...

    Hibernate 手册中文版chm格式

    3. 查询语言(HQL):Hibernate 提供了自己的SQL方言——HQL,用于更面向对象的查询。手册会展示如何编写HQL查询,包括基本查询、条件查询、分组和排序等。 4. Criteria查询:提供了一种基于对象的查询方式,比HQL...

Global site tag (gtag.js) - Google Analytics