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 ...
随机推荐
- spawn-fcgi原理及源代码分析
spawn-fcgi是一个小程序,作用是管理fast-cgi进程,功能和php-fpm类似,简单小巧,原先是属于lighttpd的一部分.后来因为使用比較广泛.所以就迁移出来作为独立项目了.本文介绍的 ...
- 改动app的默认设置(包含改动默认launcher)
1.改为自己的launcher ComponentName component = new ComponentName( context.getPackageName(), MainActivity. ...
- linux 流量控制全攻略(TC)
TC很是强大啊,很多所谓的硬件路由器,都是基于这个做的. TC介绍 在linux中,TC有二种控制方法CBQ和HTB.HTB是设计用来替换CBQ的.它是一个层次式的过滤框架.TC包括三个基本的构成块: ...
- C++中常函数内部的this指针也是const类型的
代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 // 读取连接信息 void ThirdWizardPage::ReadConnection() { QFile f ...
- lua工具库penlight--07函数编程(二)
列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)] # == [0,1,2,3,4] 在 Lua,使用pl.c ...
- PHP——0128练习相关1——window.open()
Window.open()方法参数详解 1, 最基本的弹出窗口代码 window.open('page.html'); 2, 经过设置后的弹出窗口 window.open('page.html ...
- flume中Source
Spooling Directory Source: 以下2组参数解释: fileHeader及fileHeaderKey:fileHeader是个布尔值,可配置为true或者false,表示在flu ...
- 百度JS模板引擎
1. 应用场景 前端使用的模板系统 或 后端Javascript环境发布页面 2. 功能描述 提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同 ...
- Nginx + Lua + 共享内存
转自:http://blog.csdn.net/lxb_champagne/article/details/17099383 lua_package_path "/usr/local/sha ...
- PHP多进程(4) :内部多进程
说的都是只兼容unix 服务器的多进程,下面来讲讲在window 和 unix 都兼容的多进程(这里是泛指,下面的curl实际上是通过IO复用实现的). 通过扩展实现多线程的典型例子是CURL,CUR ...