分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Hibernate(四) - HQL_QBC查询详解--抓取策略优化机制

发布时间:2023-09-06 02:16责任编辑:赖小花关键词:Hibernate

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查询详解--抓取策略优化机制

原文地址:https://www.cnblogs.com/xifengbuqi/p/9738649.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved