Hibernate的检索方式
  检索方式(查询的方式
    导航对象图检索方式: 根据已经加载的对象导航到其他对象
      Customer customer = (Customer)session.get(Customer.class,1);
      customer.getOrders();// 获得到客户的订单
    OID 检索方式: 按照对象的 OID 来检索对象
      get()/load();方法进行检索.
    HQL 检索方式: 使用面向对象的 HQL 查询语言
      Query query = session.createQuery(“HQL”);
    QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
      Criteria criteria = session.createCriteria(Customer.class);
    本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
      SQLQuery query = session.createSQLQuery(“SQL”);
HQL
  HQL:Hibernate Query Language
    特点:面向对象的查询,支持方法链编程
  1.查询所有记录

List<Customer> list = session.createQuery("from Customer").list();
for (Customer customer : list) {
  System.out.println(customer);
}

  2.查询使用别名

// 使用别名,别名as可以省略
List<Customer> list =session.createQuery("from Customer c").list();
System.out.println(list);
// 使用别名:带参数
List<Customer> list = session.createQuery("from Customer as c where c.cname = ?").setString(0, "小沈").list();
System.out.println(list);
// 不支持 select * from Customer写法.可以写成 select 别名 from Customer as 别名;
List<Customer> list = session.createQuery("select c from Customer c").list();
System.out.println(list);

  3.排序

List<Customer> list = session.createQuery("from Customer c order by c.id desc").list();
for (Customer customer : list) {
  System.out.println(customer);
}

  4.分页查询

Query query = session.createQuery("from Order");
query.setFirstResult(20);
query.setMaxResults(10);
List<Order> list = query.list();
for (Order order : list) {
  System.out.println(order);
}

  5.单个对象查询

Customer customer = (Customer) session.createQuery("from Customer where cname = ?").setString(0, "小明").uniqueResult();
System.out.println(customer);

  6.参数绑定

// 1.使用?号方式绑定
Query query = session.createQuery("from Customer where cname = ?");
query.setString(0, "小沈");
List<Customer> list = query.list();
System.out.println(list); Query query = session.createQuery("from Customer where cname = ? and cid =?");
query.setString(0, "小沈");
query.setInteger(1,3);
List<Customer> list = query.list();
System.out.println(list);
// 2.使用名称的方式绑定
Query query = session.createQuery("from Customer where cname=:name and cid=:id");
query.setString("name", "小沈");
query.setInteger("id", 3);
List<Customer> list = query.list();
System.out.println(list);
// 3.绑定实体
List<Order> list = session.createQuery("from Order o where o.customer = ?").setEntity(0, customer).list();
for (Order order : list) {
  System.out.println(order);
}

  7.投影操作

// 查询客户的名称
List<Object> list = session.createQuery("select c.cname from Customer c").list();
System.out.println(list);
//查两个属性
List<Object[]> list = session.createQuery("select c.cid,c.cname from Customer c").list();
for (Object[] objects: list) {
  System.out.println(Arrays.toString(objects));
}
//需要提供适当的构造方法
List<Customer> list = session.createQuery("select new Customer(cname) from Customer").list();
System.out.println(list);

  8.模糊查询

Query query = session.createQuery("from Customer where cname like ?");
query.setParameter(0, "小%");
List<Customer> list = query.list();
System.out.println(list);

  9.聚集函数

Long count = (Long) session.createQuery("select count(*) from Order").uniqueResult();
System.out.println(count);

  10.命名查询(在配置文件中配置查询语句)

List<Customer> list = session.getNamedQuery("findAll").list();
System.out.println(list);

  SQL多表查询(连接)
    交叉连接(用得少):select * from A,B
    内连接(自然连接):select * from A inner join B on A.字段 = B.字段;
    隐式内连接:select * from A,B where A.字段 = B.字段;
    外连接
      左外连接:select * from A left outer join B on A.字段 = B.字段;
      右外连接:select * from A right outer join B on A.字段 = B.字段;
  HQL多表的查询
    交叉连接,内连接,隐式内连接,迫切内连接,左外连接,迫切左外连接,右外连接
    隐式内连接(了解)
      createQuery("from Order o where o.customer.name like 'T%'");
      等价于:from Order o join o.customer c where c.name like 'T%'
    HQL的内连接和迫切内连接区别(其他类似):
      内连接查询 :将数据封装一个List<Object[]>中.
      迫切内连接 :将数据封装一个List<Customer>中.但是迫切内连接,得到会有重复记录 ,需要使用distinct排重.

// 内连接查询:
Query query = session.createQuery("from Customer c inner join c.orders");
List<Object[]> list = query.list();
for (Object[] objects : list) {
  Customer c = (Customer)objects[0];
  Order o = (Order)objects[1];
  System.out.println(c.getCid()+" "+c.getCname()+" "+c.getAge());
  System.out.println(o.getOid()+" "+o.getAddr());
}
// 迫切内连接:使用一个关键字 fetch(HQL)
Query query = session.createQuery("select distinct c from Customer c inner join fetch c.orders");
List<Customer> list = query.list();
for (Customer customer : list) {
  System.out.println(customer);
}

QBC
  1.查询所有记录

List<Customer> list = session.createCriteria(Customer.class).list();
for (Customer customer : list) {
  System.out.println(customer);
}

  2.排序

List<Customer> list = session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();
for (Customer customer : list) {
  System.out.println(customer);
}

  3.分页

Criteria criteria = session.createCriteria(Order.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<Order> list = criteria.list();
for (Order order : list) {
  System.out.println(order);
}

  4.获取单个对象

Customer customer = (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).uniqueResult();
System.out.println(customer);

  5.带参数的查询

List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).list();
System.out.println(list); List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).add(Restrictions.eq("cid", 2)).list();
System.out.println(list);

  6.模糊查询

Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.like("cname", "大%"));
List<Customer> list = criteria.list();
System.out.println(list);

SQL

List<Object[]> list = session.createSQLQuery("select * from customer").list();
for (Object[] objects : list) {
  System.out.println(Arrays.toString(objects));
}
List<Customer> list = session.createSQLQuery("select * from customer").addEntity(Customer.class).list();
for (Customer customer : list) {
  System.out.println(customer);
}

离线查询
  

@Test
/*
* 离线条件查询
*/
public void demo(){
  // web层的封装
  DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
  criteria.add(Restrictions.eq("cname", "小明"));
  criteria.add(Restrictions.eq("cid", 2));
  // 传递到DAO层
  Session session = HibernateUtils.openSession();
  Transaction tx = session.beginTransaction();
  Criteria c1 = criteria.getExecutableCriteria(session);
  List<Customer> list = c1.list();
  System.out.println(list);
  tx.commit();
  session.close();
}

Hibernate的检索方式的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  2. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  3. Hibernate的检索方式--查询数据的方式

    Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...

  4. 【Hibernate】检索方式

    一.概述 二.HQL 2.1 简介 2.2 查询所有记录 2.3 查询使用别名 2.4 排序 2.5 分页查询 2.6 单个对象查询 2.7 参数绑定 2.8 投影操作 2.9 模糊查询 2.10 S ...

  5. Hibernate之检索方式

    时间:2017-1-22 16:09 --检索方式Hibernate中提供了以下几种检索对象的方式:    *   导航对象图检索方式        根据已经加载额对象导航到其他对象.        ...

  6. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  7. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Hibernate检索方式 分类: SSH框架 2015-07-10 22:10 4人阅读 评论(0) 收藏

    我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位.那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为Hi ...

  9. Hibernate检索方式(转载)

    我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位. 那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为H ...

随机推荐

  1. Java基础-重写方法

    一般我们需要在新类上重写,两个类的实现: class Animal{ public void move(){ System.out.println("动物可以移动"); } } c ...

  2. CRM(客户关系管理)

    CRM最初是由Gartner Group提出的. CRM定义:"客户关系管理(CRM),是代表增进赢利.收入和客户满意度而设计的,企业范围的商业战略." 我们可以看出,Gartne ...

  3. Python学习笔记——列表

    1.创建列表类型数据并给其赋值 >>> aList = [123,'abc',4.56,['inner','list'],7-9j] >>> aList [123, ...

  4. jQuery验证控件jquery.validate.js使用说明

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  5. 【11-23】mysql学习笔记02

    SQL的历史 SQL是Structed Query Language 的缩写,即”结构化查询语言” SQL原名是 sequel,后来由于法律原因,改名 SQL最早可以追溯到 1974 年,源于 IBM ...

  6. PHP中spl_autoload_register()函数的用法

    spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autol ...

  7. 搭建一个简单struts2框架的登陆

    第一步:下载struts2对应的jar包,可以到struts官网下载:http://struts.apache.org/download.cgi#struts252 出于学习的目的,可以把整个完整的压 ...

  8. C和指针 第十章 结构和联合 (二)

    结构体传值: 结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率.如果不希望程序对结构体变量改变可以加入const关键词. typed ...

  9. servlet 之request

    request对象中其他功能     一.转发和包含         转发==>用于一个servlet和一个jsp合作处理             servlet用于处理逻辑.jsp用于显示   ...

  10. JavaSE18章_JSON解析详解

    一.JSON简介 JSON(JavaScript Object Notation),是一种轻量级的数据交换格式.JSON是存储和交换文本信息的,语法类似 XML.易于人阅读和编写,同时也易于机器解析和 ...