Hibernate的检索方式--查询数据的方式
Hibernate 提供了以下几种检索对象的方式
1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)
2OID 检索方式: 按照对象的 OID 来检索对象(更具ID查询---find(Id).get(),load())
3HQL 检索方式: 使用面向对象的 HQL 查询语言
4QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
5本地SQL 检索方式: 使用本地数据库的 SQL 查询语句
现在介绍一下HQL和QBC和本地SQL这三种方式
I HQL检索方式
方法介绍:
setEntity(): 把参数与一个持久化类绑定
setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映射类型
setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况 下, Query 从查询结果中的第一个对象开始检索
setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
list():执行查询语句并返回list对象
字段说明:
ORDER BY :对结果集排序,那依赖那个字段排序
DISTINCT 关键字来保证查询结果不会返回重复元素
GROUP BY 关键字对数据分组,
HAVING 关键字对分组数据设定约束条件
notice:SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING因为SELECT清单中的列和外部子查询中的列。
字段的使用示例:
HQL 的参数绑定由两种形式:
按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.
按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
HQL还可以使用数据库的函数--例如:count(),sum(),mix(),max(),avg()
函数使用示例:
Query query = session.createQuery("select count(o.customer),o.orderName FROM Order o");
List list = query.list();
Iterator iter = list.iterator();
Object[] objs = null;
while(iter.hasNext()){
objs = (Object[]) iter.next();
for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
}
System.out.println("-------------------");
}
使用基本步骤:
1通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句.
2HQL 查询语句中可以包含命名参数(以":参数名"命名) 然后动态绑定参数
3调用 Query 相关方法执行查询语句.
notice:Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型
Example:使用HQL查询order表price大于1000,id=5;
1创建Query对象:String hql="from order where price >=:price and id=:id"
Query query=session.createQuery(hql);
2动态绑定参数:query.setParameter("price","1000").setParameter("id","5");
3执行语句,返回对象: list<order> orders=query.list();
4然后遍历list就可以得到了order对象了
HQL连接查询==类似SQL语句的连接查询(FETCH:)
INNER JOIN FETCH: 关键字表示迫切内连接, 也可以省略 INNER 关键字,只有左边和右边都相等的数据才会被查询出来,
并且在查询出来时,关联的对象也会被初始化
INNER JOIN :关键字表示内连接, 也可以省略 INNER 关键字,只有左边和右边都相等的数据才会被查询出来,但是关联的对象在查询时不会被初始化
LEFT JOIN :关键字表示左连接, 只有左边有数据才会被查询出来
OUTER JOIN :关键字表示右连接, 只有右边有数据才会被查询出来
II QBC查询方式
使用步骤
①取得criteria对象: Criteria criteria=session.createCriteria(对象.class)
②设置Criterition ①Criterition criterition=Restrictions.like("name","T%")
②Criterition criterition=Expression.like("name", "T%");
③为criteria添加criterition, criteria.add(criterition);
④criteria执行list()方法 criteria.list();
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。
QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
QBC的add()也是支持链式风格,add()放回的对象也是Criteria
示例代码:
@test
public void testQBC(){
Criteria criteria = session.createCriteria(Order.class);
Criterion criterion1 = Expression.like("orderName", "买%");
Criterion criterion2 = Expression.eq("orderId", new Integer(2));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
List<Order> orders=criteria.list();
for (Order order : orders) {
System.out.println(order.getOrderName());
}
}
Restrictions的用法说明--(Restrictions就是相当于一个条件比较的对象)
方法 说明
Restrictions.eq =
Restrictions.allEq 利用Map来进行多个等于的限制
Restrictions.gt >
Restrictions.ge >=
Restrictions.lt <
Restrictions.le <=
Restrictions.between BETWEEN
Restrictions.like LIKE
Restrictions.in in
Restrictions.and and
Restrictions.or or
Restrictions.sqlRestriction 用SQL限定查询
III本地SQL的查询模式
SQL检索方式(是面向数据库的,多以查询时字段时数据的字段)
采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。
有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。
示例代码:
@Test
public void testSQL(){
Query query = session.createSQLQuery("select * from CUSTOMERS as c where c.CUSTOMER_NAME like :CUSTOMER_NAME and c.CUSTOMER_ID=:CUSTOMER_ID");
// 动态绑定参数
query.setString("CUSTOMER_NAME", "zhangsan");
query.setInteger("CUSTOMER_ID", 2);
// 执行检索
List result = query.list();
Iterator iterator=result.iterator();
//投影查询(也就是select *)list()方法返回的Object[]对象,Object[0]的第一个字段,object[1]是第二个字段
Object[] objs=null;
while (iterator.hasNext()) {
objs=(Object[])iterator.next();
for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
}
}
}
IV对查询结果排序
HQL和QBC都支持对查询结果进行排序。
query = session.createQuery("from Customer as c order by c.name");
query.addOrder(Order.asc("name"));
//排序
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));
IIV分页查询
Query和Criteria接口都提供了用于分页显式查询结果的方法。
setFirstResult(int firstResult):设置从那个对象开始检索,参数表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认从0检索。
setMaxResult(int maxResults):设置一次最多检索出的对象数目。默认检索所有。
8检索单个对象
Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。
list()方法:返回一个List类型的查询结果。
uniqueResult()方法:返回单个对象。
三、连接查询
HQL和QBC支持的各种连接类型
在程序中指定的链接查询类型 |
HQL语法 |
QBC语法 |
使用范围 |
内连接 |
inner join 或者 join |
Criteria.createAlias() |
适用于有关联的持久化类,并且在映射文件中对这种关联关系作了映射。 |
迫切内连接 |
inner join fetch 或者 join fetch |
不支持 |
|
左外连接 |
left outer join 或者 left join |
不支持 |
|
迫切左外连接 |
left outer join fetch 或者left join fetch |
FetchMode.EAGER |
|
右外连接 |
right outer join 或者 right join |
不支持 |
|
交叉连接 |
ClassA,ClassB |
不支持 |
适用于不存在关联关系的持久化类 |
Hibernate的检索方式--查询数据的方式的更多相关文章
- 通过ajax GET方式查询数据,Django序列化objects
点击“查找2”按钮,通过ajax GET方式进行查询数据,这样页面不需要整体刷新,之后清空tbody数据,将查询结果重新附加到tbody 前端html: <div class="box ...
- Solr记录-solr检索和查询数据
Solr检索数据 在本章中,我们将讨论如何使用Java Client API检索数据.假设有一个名为sample.csv的.csv文档,其中包含以下内容. 001,9848022337,Hyderab ...
- (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接
放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题: 1.如何连续爬取 2.数据输出方式 3.数据库链接 一,如何连续爬取: 思考:要达到连续爬取,逻辑上无非从以下的方向着 ...
- mORMot学习笔记2-2种方式查询数据
本例使用SqlServer 第一种方式结果放入Memo控件,,需要引用SynCommons, SynDB, SynOleDb; procedure TForm1.Button1Click(Sender ...
- Java_Web三大框架之Hibernate+jsp+selvect+HQL查询数据
俗话说:"好记性不如烂笔头".本人学习Hibernate也有一个星期了,对Hibernate也有一个初步的了解.下面对Hibernate显示数据做个笔记,使用租房系统的Hibern ...
- Dynamics CRM2016 查询数据的三种方式的性能对比
之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...
- Hibernate search使用示例(基础小结-注解方式)
(对于项目环境配置,一直没怎么看过.这次经历里从基础环境搭建到hibernate search示例的完成) 1.首先创建project,选择了web project. 2.导入hibernate se ...
- Oracle 检索数据(查询数据、select语句)
用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...
- MyBatis 传入List集合作为条件查询数据
使用的是SSM框架,数据库是MySQL,做查询的时候传入List集合,使用SQL语句的in方式查询数据 主要有两点问题:我的List集合是利用的另外一个语句查询出来的,传入参数是int类型,返回值是i ...
随机推荐
- Js动态添加复选框Checkbox
Js动态添加复选框Checkbox的实例方法!!! 首先,使用JS动态产生Checkbox可以采用如下类似的语句: var checkBox=document.createElement(" ...
- DPDK 全面分析
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 高性能网络技术 ...
- 推荐一个入门最佳Git教程
这是我最近发现的一个针对入门Git教程,浅显易懂,点到为止,很适合初学者及使用Git的爱好者,学完该教程应付开发工作绰绰有余. http://www.liaoxuefeng.com/wiki/0013 ...
- location 将跟目录下某个文件夹指向2级目录
例如: /caffespressos/指向/web01/caffe/ [root@web01 default]# tree web01/ web01/ └── caffe └── index.html ...
- Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)
Git使用手册 目录 1 引言 2 Git.GitLab简介 2.1 Git 2.2 GitLab 2.3 Git基本概念 3 运行环境 4 ...
- 56. Two Sum【easy】
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- print()函数的end 参数
print()函数含end参数时:结束的时候已什么结尾,后面的参数可以是任何形式 [print() 默认以'\n' 结尾] 输出结果: print()函数不含end参数时: 输出结果:
- iOS状态栏标志
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; //显示 [UIApplication sharedA ...
- 扩展RBAC用户角色权限设计方案<转>
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- rt serial 的编写
/* * Copyright (C) 2005-2007 Jan Kiszka <jan.kiszka@web.de>. * * Xenomai is free software; you ...