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 criteria.setFetchMode("orders", org.hibernate.FetchMode.JOIN); |
|
右外连接 |
right outer join 或者 right join |
不支持 |
|
交叉连接 |
ClassA,ClassB |
不支持 |
适用于不存在关联关系的持久化类 |