Hibernate - HQL_QBC查询详解--抓取策略优化机制
Posted xifengbuqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate - HQL_QBC查询详解--抓取策略优化机制相关的知识,希望对你有一定的参考价值。
Hibernate 的查询方式
在 Hibernate 中提供了很多种的查询的方式。Hibernate 共提供了五种查询方式。
1、Hibernate 的查询方式:OID 查询
OID检索:Hibernate根据对象的OID(主键)进行检索。
① 使用 get 方法
Customer customer = session.get(Customer.class,1l);
② 使用 load 方法
Customer customer = session.load(Customer.class,1l);
2、Hibernate 的查询方式:对象导航检索
对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l); Customer customer = linkMan.getCustomer(); Customer customer = session.get(Customer.class,2l); Set<LinkMan> linkMans = customer.getLinkMans();
3、Hibernate 的查询方式:HQL 检索
HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
在进行 HQL 查询之前,先做一些准备。首先,新建一个 Java 项目,在项目里面新建一个文件夹,命名为 lib,并将上一个项目用到的包复制过来,添加的构建路径中去 。把工具类和配置文件拷贝过来。
① 初始化数据
package com.itheima.hibernate.demo1; import java.util.Arrays; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.itheima.hibernate.domain.Customer; import com.itheima.hibernate.domain.LinkMan; import com.itheima.hibernate.utils.HibernateUtils; /** * HQL的查询方式的测试类 * * @author jt * */ public class HibernateDemo1 { @Test /** * 初始化数据 */ public void demo1() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 创建一个客户 Customer customer = new Customer(); customer.setCust_name("李向文"); for (int i = 1; i <= 10; i++) { LinkMan linkMan = new LinkMan(); linkMan.setLkm_name("王东" + i); linkMan.setCustomer(customer); customer.getLinkMans().add(linkMan); session.save(linkMan); } session.save(customer); tx.commit(); }
3.1、HQL 的简单查询
/** * HQL的简单查询 */ public void demo2() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 简单的查询 // 返回一个 Query 的接口,而且支持链式写法 Query query = session.createQuery("from Customer"); List<Customer> list = query.list(); // sql中支持*号的写法:select * from cst_customer; 但是在HQL中不支持*号的写法。 /* * Query query = session.createQuery("select * from Customer");// 报错 * List<Customer> list = query.list(); */ // 再打印的时候,会默认调用对象的 toString(),两边不要都 toString(),都设置的话,其实就是一个死循环 // 为什么呢?因为你客户里面有联系人的集合,它需要把联系人给打印了;联系人那边呢,又有客户;客户又有联系人... // 这样的话就是一个死循环,所以在 toString() 的时候,把集合先去掉;打印先不打印集合,只是单纯的去看客户的一些数据 // 这里一定需要注意,除了客户的打印,像你 JSON 的转换,两边互相与对象的时候,JSON 一转换,它也是一个死循环。 for (Customer customer : list) { System.out.println(customer); } tx.commit(); }
需要注意的是“from customer”这里是一个对象,正常的写法应该是带包名的;但是在映射里面已经配置的包了,所以这个地方可以省略。一定要注意 ,这个地方是类名,而不是你的表名。
3.2、HQL 的别名查询
@Test /** * 别名查询 */ public void demo3() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 别名的查询 /* * Query query = session.createQuery("from Customer c"); List<Customer> * list = query.list(); */ // 支持.属性的写法,但是需要注意的是 ,这种方式得到的 list 里面放的就不是一个对象了 Query query = session.createQuery("select c from Customer c"); List<Customer> list = query.list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }
3.3、HQL 的排序查询
它跟 SQL 语句很类似的,所以再做排序查询的时候跟 SQ L也是很相似的。
里面也可以使用 order by,后面跟的是类里面的属性名,默认情况下就是升序的。
@Test /** * 排序查询 */ public void demo4() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 排序的查询 // 默认情况 // List<Customer> list = session.createQuery("from Customer order by // cust_id").list(); // 设置降序排序 升序使用asc 降序使用desc List<Customer> list = session.createQuery("from Customer order by cust_id desc").list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }
3.4、HQL 的条件查询
支持两种条件查询的方式,
@Test /** * 条件查询 */ public void demo5() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 条件的查询 // 一、按位置绑定:根据参数的位置进行绑定。 // 一个条件 /* * Query query = session.createQuery("from Customer where cust_name = ?" * ); query.setParameter(0, "李兵"); List<Customer> list = query.list(); */ // 多个条件 /* * Query query = session.createQuery( * "from Customer where cust_source = ? and cust_name like ?"); * query.setParameter(0, "小广告"); query.setParameter(1, "李%"); * List<Customer> list = query.list(); */ // 二、按名称绑定,名称随便起 Query query = session.createQuery("from Customer where cust_source = :aaa and cust_name like :bbb"); // 设置参数: query.setParameter("aaa", "朋友推荐"); query.setParameter("bbb", "李%"); List<Customer> list = query.list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }
3.5、HQL 的投影查询
投影查询:查询对象的某个或某些属性。
@Test /** * 投影查询 */ public void demo6() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 投影查询 // 单个属性,封装的是对象
// 返回一个 list,但里面装的是一个字符串类型的值。Object 可以强转称字符串 /* * List<Object> list = session.createQuery( * "select c.cust_name from Customer c").list(); for (Object object : * list) { System.out.println(object); } */ // 多个属性,封装的是对象的数组
// list 集合里面放置的是一个 Object 数组,不同类型的值要想通用,只能放到一个数组之中 /* * List<Object[]> list = session.createQuery( * "select c.cust_name,c.cust_source from Customer c").list(); for * (Object[] objects : list) { * System.out.println(Arrays.toString(objects)); } */ // 查询多个属性,但是我想封装到对象中。 List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }
4、Hibernate 的查询方式:QBC 检索
5、Hibernate 的查询方式:SQL 检索
以上是关于Hibernate - HQL_QBC查询详解--抓取策略优化机制的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate学习———— hibernate中查询方式详解
分享知识-快乐自己:Hibernate 中Criteria Query查询详解