*糖果屋*煋光游樂場

人們說騎上木馬de背 就可以開始流浪...

转 关于查询语句

Hibernate检索对象方式(查询一)
字号 [ ]

Hibernate检索对象方式
教学内容
HQL检索方式
QBC检索方式
本地SQL检索方式

Hibernate提供检索对象方式
导航对象图检索方式
根据已经加载对象,导航到其他对象。例如,对于已经加载Customer对象,调用它getOrders().iterator()方法就可以导航到所有关联Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联Order对象,否则就从缓存中取得Order对象。
OID检索方式
按照对象OID来检索对象。Sessionget()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象方式。
HQL检索方式
使用面向对象HQL查询语言。Sessionfind()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供专门HQL查询接口,能够执行各种复杂HQL查询语句。本章有时把HQL检索方式简称为HQL。
QBC检索方式
使用QBC(Query By Criteria)API来检索对象。这种API封装了基于字符串形式查询语句,提供了更加面向对象接口。本章有时把QBC检索方式简称为QBC。
本地SQL检索方式
使用本地数据库SQL查询语句。Hibernate会负责把检索到JDBC ResultSet结果集映射为持久化对象图。

HQL检索方式
HQL(Hibernate Query Language)是面向对象查询语言,它和SQL查询语言有些相似。在Hibernate提供各种检索方式中,HQL是使用最广一种检索方式。它具有以下功能:
在查询语句中设定各种查询条件
支持投影查询,即仅检索出对象部分属性
支持分页查询
支持连接查询
支持分组查询,允许使用having和group by关键字
提供内置聚集函数,如sum()、min()和max()
能够调用用户定义SQL函数
支持子查询,即嵌入式查询
支持动态绑定参数
Sessionfind()方法以及Query接口
Session类find()方法以及Query接口都支持HQL检索方式。
这两者区别在于,前者只是执行一些简单HQL查询语句便捷方法,它不具有动态绑定参数功能,而且在Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正HQL查询接口,它提供了以上列出各种查询功能。
HQL检索步骤
 //创建一个Query对象
Query query=session.createQuery("from Customer as c where "
    +" c.name=:customerName "
    +"and c.age=:customerAge");
//动态绑定参数
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
//执行查询语句,返回查询结果
List result= query.list();
HQL检索步骤
 (1)通过SessioncreateQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。
(2)动态绑定参数。Query接口提供了给各种类型命名参数赋值方法,例如setString()方法用于为字符串类型customerName命名参数赋值。
(3)调用Querylist()方法执行查询语句。该方法返回List类型查询结果,在List集合中存放了符合查询条件持久化对象。
方法链编程风格
 List result=session.createQuery("……")
.setString("customerName","Tom")
.setInteger("customerAge",21)
.list(); 
方法链编程风格能使程序代码更加简洁。
QBC检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式HQL查询语句。
QBC API 提供了检索对象另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
QBC检索方式
//创建一个Criteria对象
Criteria criteria=session.createCriteria(Customer.class);
//设定查询条件,然后把查询条件加入到Criteria中
Criterion criterion1= Expression.like("name", "T%") ;
Criterion criterion2= Expression.eq("age", new Integer(21)) ;
criteria=criteria.add(criterion1);
criteria=criteria.add(criterion2);
//执行查询语句,返回查询结果
List result=criteria.list();
QBC检索步骤
(1)调用SessioncreateCriteria()方法创建一个Criteria对象。
(2)设定查询条件。Expression类提供了一系列用于设定查询条件静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteriaadd()方法用于加入查询条件。
(3)调用Criterialist()方法执行查询语句。该方法返回List类型查询结果,在List集合中存放了符合查询条件持久化对象。对于以上程序代码,当运行Criterialist()方法时,Hibernate执行SQL查询语句为:
    select * from CUSTOMERS where NAME like 'T%' and AGE=21;

方法链编程风格
List result=session.createCriteria(Customer.class)
    .add(Expression.like("name", "T%")
    .add(Expression.eq("age", newInteger(21))
    .list();


比较运算(大于)
List list = session.createQuery("from Hx c where c.id>0")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.gt("id", new Integer(0)))
 .list();
比较运算(不等于)
List list = session.createQuery("from Hx c where c.id<>0")
.list();

List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.eq("name", "zmx")))
.list();
比较运算(不等)
List list = session.createQuery("from Hx c where c.name is null")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.isNull("name")))
.list();
比较运算(范围)
List list = session.createQuery("from Hx c where c.name in(‘zmx’)")
.list();
String names[]={“zmx”,”hx”};
List list = session.createCriteria(Hx.class)
.add(Expression.in(“name”,names))
.list();
模糊查询
List list = session.createQuery("from Hx c where c.name like ‘Z%’")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.like(“name”,”Z%”)))
.list();

QBE查询(query by Example)
它是QBC子功能,允许创建一个对象模板,然后检索出所有和模板相同对象,但功能不是很强大,且只支持=和like运算符
   Hx hx = new Hx();
   hx.setAge(33);
   List list = session.createCriteria(Hx.class)
       .add(Example.create(hx)).list();
查询排序
HQL方式
List list = session.createQuery("from Hx c order by c.name")
            .list();

QBC方式
List list = session.createCriteria(Hx.class)
            .add(Expression.like("name","z%"))
            .addOrder(Order.desc("name"))
            .list();
分页查询
 Query和Criteria接口都提供了用于分页显示查询结果方法
setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中索引位置,索引位置起始值为0。默认情况下,Query和Criteria接口从查询结果中第一个对象,也就是索引位置为0对象开始检索。
setMaxResult(int maxResults):设定一次最多检索出对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有对象。

分页查询
//采用HQL检索方式
Query query = session.createQuery("from   
        Customer c
        order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result = query.list();

//采用QBC检索方式
Criteria criteria = session.createCriteria(
             Customer.class);
criteria.addOrder(
              Order.asc("name") );
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list();

链索查询
List list = session.createQuery("from Hx")
            .setFirstResult(0)
            .setMaxResults(2)
            .list();
List list = session.createCriteria(Hx.class)
            .setFirstResult(0)
            .setMaxResults(2)
            .list();
检索单个对象
Query和Criteria都提供了返回单个对象方法uniqueResult().
先调用setMaxResult(1)方法,把最大检索数目设为1,在调用uniqueResult()方法

Hx hx = (Hx)session.createQuery("from Hx")
            .setMaxResults(1)
            .uniqueResult();
Hx hx = (Hx)session.createCriteria(Hx.class)
         .addOrder(Order.asc("name"))
         .setMaxResults(1)
         .uniqueResult();
与对象属性绑定
Hx hx = new Hx();
hx.setAge("33");
List list = session.createQuery("from Hx as c where c.age=:age")
            .setProperties(hx)
            .list();
SQL内连接
内连接就是传统连接操作,用join连接关联表,on作为连接条件,where指定其他限定条件查询
如:
select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
SQL左外连接
在结果表中包含第一个表中满足所有纪录,如果是在连接条件上匹配纪录,则第二个表返回相应值,否则第二个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx  left join hxhome on hx.id=hxhome.hxid

SQL右外连接
在结果表中包含第二个表中满足所有纪录,如果是在连接条件上匹配纪录,则第一个表返回相应值,否则第一个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx  right outer join hxhome on hx.id=hxhome.hxid

迫切左外连接
以下两种检索方式是等价,它们都能同时迫切左外连接类B和类C:
//HQL迫切左外连接检索方式
from A a left join fetch a.b b left join fetch a.c c where b is not
null and c is not null

//QBC迫切左外连接检索方式
List result=session.createCriteria(A.class)
.setFetchMode("this.b",FetchMode.EAGER)
.setFetchMode("this.c",FetchMode.EAGER)
.add(Expression.isNotNull("this.b"))
.add(Expression.isNotNull("this.c"))
.list();
投影查询
select关键字用于选择对象部分属性,例如:
Iterator it=session.createQuery(
    "select c.id,c.name,o.orderNumber "
 + "  from Customer c join  c.orders o "
 +" where o.orderNumber like 'T%'" ).list().iterator();

while(it.hasNext()){
 Object[] row=(Object[])it.next();
 Long orderNumber=(String)row[2];
 System.out.println(id+" "+name+" "+orderNumber);
}
投影查询
HQL查询语句对应SQL语句为:
select c.ID,c.NAME,o.ORDER_NUMBER
from CUSTOMERS c inner join ORDERS o
on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
以上查询语句查询结果如下:
+----+------+--------------+
| ID | NAME | ORDER_NUMBER |
+----+------+--------------+
|  1 | Tom  | Tom_Order001 |
|  1 | Tom  | Tom_Order002 |
|  1 | Tom  | Tom_Order003 |
+----+------+--------------+
Querylist()方法返回集合中包含三个对象数组类型元素,每个对象数组代表以上查询结果一条记录。

 
阅读更多
上一篇hibernate模糊查询的几种方式
下一篇hibernate 读书笔记
想对作者说点什么? 我来说一句

SQL Server2008yingyong

2011年07月23日 205KB 下载

SQL常用查询

2012年06月21日 27KB 下载

SQL Server 短信平台查询语句

2013年11月06日 231B 下载

数据库文档

2011年10月22日 370KB 下载

SQL查询语句大全SQL查询语

2011年03月12日 528KB 下载

没有更多推荐了,返回首页

关闭
关闭