10.Hibernate的检索方式

*   HQL 检索方式: 使用面向对象的 HQL 查询语言

*   QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口

*   本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句

*   HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式

*   Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型

*   HQL vs SQL:

              HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性

              SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段

*   Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能

1.简单的查询

      Query query=session.createQuery("from Customer  c where c.name='tom'");
      List<Customer> list=query.list();
*   debug watch表达式 query.list 会多两条查询语句  表达式上点orders才会查询orders集合

      Criteria cr=session.createCriteria(Customer.class);
      Criterion cn=Restrictions.eq("name", "tom");
      cr.add(cn);
      List<Customer> list=cr.list();
*   使用qbc  Criteria标准化查询接口
*   每个Criterion对象表示一个查询条件

*   Expression.eq("name", "tom");

2.多态查询

 Query query=session.createQuery("from java.io.Serializable  o");
 query.list();
*   查询所有实现了序列化接口的持久化类
Query query=session.createQuery("from java.lang.Object  o");
query.list();
*   查询所有继承了Object类的持久化类
3.对查询结果排序

 Query query=session.createQuery("from Customer c  order by c.id desc");
 query.list();
*   desc 降序  asc 升序 默认升序
 Criteria cr=session.createCriteria(Customer.class);
 cr.addOrder(org.hibernate.criterion.Order.desc("id"));
 cr.list();
*   qbc查询方式

4.分页查询

Query query=session.createQuery("from Order o  order by o.id desc");
query.setFirstResult(0);
query.setMaxResults(10);
query.list();
*   查询第一条到第十条数据

Criteria cr=session.createCriteria(Order.class);
cr.addOrder(org.hibernate.criterion.Order.desc("id"));
cr.setFirstResult(0);
cr.setMaxResults(10);
cr.list();
5.检索单个对象
 Query query=session.createQuery("from Customer  c where c.name='tom'");
 query.uniqueResult();
6.1绑定参数的形式,按参数名称绑定

 Query query=session.createQuery("from Customer  c where c.name=:cname and c.age=:cage");
 //第一个参数代表名字,第二个参数代表值
 query.setString("cname", "tom");
 query.setInteger("cage", 32);
 query.list();
6.2绑定参数的形式,按参数位置绑定

  Query query=session.createQuery("from Customer  c where c.name=? and c.age=?");
  //第一个参数代表名字,第二个参数代表值
  query.setString(0, "tom");
  query.setInteger(1, 32);
  query.list();
7.在映射文件中定义命名查询语句

hibernate映射文件

 <query name="fingCustomerByName">
     <![CDATA[from Customer c where c.name like ?]]>
  </query>
java类调用查询方法
 Query query=session.getNamedQuery("fingCustomerByName");
 query.setString(0, "%t%");
 query.list();

8.迫切左外连接

Query query=session.createQuery("from Customer c left outer join fetch  c.orderes where c.name like ?");
query.setString(0, "%tom%");
List<Customer> list=query.list();
for(int i=0;i<list.size();i++){
	Customer c=list.get(i);
        System.out.println(c.getId()+"   "+c.getName()+"****************************************");
	Set orderes=c.getOrderes();
	Iterator<Order> it=orderes.iterator();
	while(it.hasNext()){
		Order o=it.next();
	        System.out.println(o.getId()+"   "+o.getOrderNumber());
	 }
}
*   返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合
9.左外连接

 Query query=session.createQuery("from Customer c left outer join c.orderes where c.name like ?");
 query.setString(0, "%tom%");
 List list=query.list();
 for(int i=0;i<list.size();i++){
	Object[] pair=(Object[])list.get(i);
	Customer c=(Customer)pair[0];  
        Order o=(Order)pair[1]; 
	System.out.println(c.getId()+"   "+c.getName()+"* "+o.getId()+"  "+o.getOrderNumber());
      }
*   语句和迫切左外差不多是一样的,迫切左外重复查询了几个字段

*   返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象

*    左连接 ,查询右边满足左边的数据
10. 内连接

 Query query=session.createQuery("from Customer c  join c.orderes where c.name like ?");
 query.setString(0, "%tom%");
 List list=query.list();
*   查询左边和右边条件相等的数据

*    返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象

11.迫切内连接

Query query=session.createQuery("from Customer c  inner join  fetch c.orderes where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
*   返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合
12.右连接

 Query query=session.createQuery("from Customer c  right outer join c.orderes where c.name like ?");
 query.setString(0, "%tom%");
 List list=query.list();
*   右连接 ,查询左边满足右边的数据
13.交差连接

*   交叉连接,也就是笛卡尔积,查两张表时,没有条件限制,如果左表有n条数据,右表有m条数据,则最后查询出来一共有n*m条数据

14.投影查询

Query query=session.createQuery("select c.name, o.orderNumber,o.price from Customer c inner join c.orderes o where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
*   查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现
*   返回值是一个对象数组,数组中存放的查询的属性值
15.使用构造函数封装查询的信息

Query query=session.createQuery("select new cn.itcast.search.CustomerRow(c.name, o.orderNumber,o.price) from Customer c inner join c.orderes o where c.name like ?");
query.setString(0, "%tom%");
List list=query.list();
*   返回的list集合存放的CustomerRow对象
16.报表查询  查询有多少客户

Query query=session.createQuery("select count(o) from Customer o");
Long count=(Long)query.uniqueResult();
*   count(*)也可以 统计有多少条记录   count(o)  是以Customer的id来统计的

*    返回的是Long类型
17.报表查询   分组

 Query query=session.createQuery("select o.name,count(*) from Customer o group by o.name");
 query.list();
*   查询的东西必须要在group by 后面 除了统计函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值