10. QBC检索步骤(1)调用Session的createCriteria()方法创建一个Criteria对象。
(2)设定查询条件。Restrictions类提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方法用于加入查询条件。
Criterion criterion1=Restrictions.like("name", "T%") ;
Criterion criterion2= Restrictions.eq("age", new Integer(21)) ;
(3)调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法时,Hibernate执行的SQL查询语句为:
select * from CUSTOMERS where NAME like 'T%' and AGE=21;
11. 方法链编程风格 List result=session.createCriteria(Customer.class)
.add(Restrictions.like("name", "T%")
.add(Restrictions.eq("age", newInteger(21))
.list();
12. SQL检索方式采用HQL或QBC检索方式时,Hibernate会生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。
有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。
//创建Query对象
Query query=session.createSQLQuery(
"select * from CUSTOMERS where NAME like :customerName "
+"and AGE=:customerAge");
//动态绑定参数
query.setString("customerName","T%");
query.setInteger("customerAge",21);
//执行SQL select语句,返回查询结果
List result=query.list();Sql查询语句
14. 分页查询 //采用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();
15. 迫切左外连接检索以下两种检索方式是等价的,它们都能同时迫切左外连接类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();
16. 投影查询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 id=(Long)row[0];
String name=(String)row[1];
String orderNumber=(String)row[2];
System.out.println(id+" "+name+" "+orderNumber);
}
17. 投影查询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 |
+----+------+--------------+
Query的list()方法返回的集合中包含三个对象数组类型的元素,每个对象数组代表以上查询结果的一条记录。while(it.hasNext()){
Object[] row=(Object[])it.next();
Long id=(Long)row[0];
String name=(String)row[1];
String orderNumber=(String)row[2];
System.out.println(id+" "+name+" "+orderNumber);
}