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 ...
随机推荐
- Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入
一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...
- 0067 MySQL的日期字段的取值用单引号
这两天在做sql练习题http://www.cnblogs.com/zxx193/p/4000467.html的时候,涉及到下面的建表+插数据操作 CREATE TABLE t1( s_no VARC ...
- IIS 与 Apache共存
http://support.microsoft.com/kb/813368 http://www.blueidea.com/computer/system/2006/3585.asp 操作其实也很简 ...
- 纯css3实现的竖形二级导航
之前为大家分享了好多导航菜单.今天给大家带来一款纯css3实现的竖形二级导航.这款导航菜单可以是无限级.一起看下效果图: 在线预览 源码下载 实现的代码. html代码: <div styl ...
- oracle存储过程函数
1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT m ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- 2.重学javascript 对象和数组
什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...
- asp.net 导出EXCEL超高兼容(不用装Excel)
用网上的代码你会发现,下载下来后,会提示"你尝试打开的的文件的格式与文件扩展名指定的格式不一致 请验证文件没有损坏且来源可信的提示,研究了好久 后来发现可以使用人家做好的组件NOPI去实现, ...
- 在Asp.net中为图像加入水印信息
using System.Drawing; using System.IO; using System.Drawing.Imaging; private void AddTextToImg(strin ...
- 004杰信-关于formSubmit('factorycreate.action','_self')路径的疑惑
本文材料来源于传智播客,在此说明. 整个项目结构: