Criteria的用法

article/2025/11/9 22:18:36

一、Hibernate提供了5种检索对象的方式

     1.导航对象图检索方式:根据已经加载的对象导航到其他对象     from  Emp e group by e.dept.deptName

     2.OID检索方式:按照对象的OID来检索对象    get/load

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

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

     5.本地SQL检索方式:使用本地数据库的SQL查询语句     createSqlQuery();

二、什么是Criteria查询(使用QBC(Query By Criteria)API来检索对象)

      解析:Criteria查询是Hibernate提供的另一种查询方式。

     主要由Criteria、Criterion接口和Restrictions类组成,他支持在运行时动态生成查询语句。

三、实例来讲解Criteria的用法。

(一)首先我们我们先来熟悉一下createCriteria()方法

      Criteria criteria = session.createCriteria(Emp.class); 

  解析:使用session.createCriteria()方法创建了criteria对象,createCriteria()方法的参数是持久化类的类型。 List<Emp> list = criteria.list();解析:使用criteria.list()执行查询语句,list()方法返回List集合。
复制代码
@Test//1.查询所有部分信息public void SelectPartMessage(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class); List<Emp> list = criteria.list();for (Emp dept : list) {System.out.println(dept.getEmpName());}tx.commit();}
复制代码

 

(二)根据条件查询

  1)比较运算符

    

HQL运算符Criteria运算方法说明
=SimpleExpression Restrictions.eq(String propertyName,Object value)等于
<>SimpleExpression Restrictions.ne(String propertyName,Object value)不等于
>SimpleExpression Restrictions.gt(String propertyName,Object value)大于
>=SimpleExpression Restrictions.ge(String propertyName,Object value)大于等于
<SimpleExpression Restrictions.lt(String propertyName,Object value)小于
<=SimpleExpression Restrictions.le(String propertyName,Object value)小于等于
is nullCriteria Restrictions.isNull(String propertyName)等于空值
is not nullCriteria Restrictions.isNotNull(String propertyName)非空值

 

 Criterion eq = Restrictions.eq("empName", "微冷的雨");  解析: Restrictions其方法的返回值是Criterion类型
复制代码
@Test//按条件查询public void HasMessage(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);Criterion eq = Restrictions.eq("empName", "微冷的雨");criteria=criteria.add(eq);List<Emp> list=criteria.list();for(Emp emps:list){System.out.println(emps.getEmpName());}}
复制代码

 

 criteria.createAlias("dept", "d");解析:查看部门下的员工,用createAlias()方法获取其部门的属性值(必须起方法才能获取部门属性值);dept(在关联emp的属性值在emp定义多对一关联)d是别名
  
Criterion criterion = Restrictions.eq("d.deptName", "开发部");
解析:d.deptName获取属性值
  
复制代码
 /*** 1.3 关联查询  查询“开发部”所有员工* */@Testpublic void connectTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);//Emp中关联的dept对象,起一个别名   dcriteria.createAlias("dept", "d");Criterion criterion = Restrictions.eq("d.deptName", "开发部");criteria.add(criterion);List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 2)范围运算符

HQL运算符Criteria运算方法说明
in(列表)

 Criterion Restrictions.in(String propertyName,Collecyion values)

或者 Criterion Restrictions.in(String propertyName,Object[] values)

等于类表中的某一个值
not in(列表) Criterion Restrictions.not(  Restrictions.in())不等于列表中的任意一个值
between 值1 and 值2 Criterion Restrictions.between(String propertyName,Object lo,Object hi)大于等于值1 并且小于等于值2
not between 值1  and 值2 Criterion Restrictions.not(Restrictions.between())小于值1 或者大于值2
lists.add("bj");
Criterion criterion=Restrictions.in("empCtity", lists);
解析:empCtity为bj的员工
复制代码
 //1.4查询地址为bj的员工信息
       @Test public void hastable(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);List<String> lists=new ArrayList<String>();lists.add("bj");Criterion criterion=Restrictions.in("empCtity", lists);criteria.add(criterion);List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

 3)字符串模式匹配

  Criterion criterion = Restrictions.ilike("empCtity", "%b%");解析:Restrictions.ilike()字符串模型匹配同时忽略大小写(有i)
  解析:Restrictions.like()字符串模型匹配
复制代码
 /*** 1.5  字符串模式匹配  * 查询员工地址中包含“s”的所有员工,忽略大小写Restrictions.ilike( )  //Ignore Like */@Testpublic void likeTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);Criterion criterion = Restrictions.ilike("empCtity", "%b%");criteria.add(criterion);List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

 4)逻辑运算符

  解释有and逻辑与   or逻辑或  not逻辑非

  Criterion criterion = Restrictions.and(c1, c2);

     解析:将两个参数传入

复制代码
 /*** 1.6    逻辑运算* and  过滤    查找地址是bj 并且  名称中包含 “雨” 的员工信息 */@Testpublic void logicTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria= session.createCriteria(Emp.class);Criterion c1 = Restrictions.eq("empCtity", "bj");Criterion c2= Restrictions.like("empName", "",MatchMode.ANYWHERE);Criterion criterion = Restrictions.and(c1, c2);criteria.add(criterion);List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

 5)集和运算

Criterion criterion = Restrictions.isEmpty("emps");
解析:Restrictions.isEmpty()集合为空,不包括任何元素
复制代码
 /*** 1.7  集合运算* 集合运算  查询 没有员工的部门* */ @Testpublic void collectionTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Dept.class); //Restrictions类方法的返回值是CriterionCriterion criterion = Restrictions.isEmpty("emps");criteria.add(criterion);List<Dept> list = criteria.list();for (Dept dept : list) {System.out.println(dept.getDeptName());}}
复制代码

 

 (三)动态查询

  解析:动态查询就是根据条件进行sql语句的拼接

复制代码
       /*** 1.8  动态查询    * 如何查找出符合以下条件的员工信息:职位是工程师,如:job = ‘engineer’工资大于2000元,如:salary > 2000入职时间在2006年12月31日至2008年12月31日之间 如何查找出符合以下条件的员工信息:地址 = ‘bj’员工编号大于0** */ @Testpublic void dynamicTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class); //00.构建出一个和page对应的条件类,依次判定条件是否为空EmpCondition condition=new EmpCondition();condition.setEmpCity("bj");condition.setEmpId(0);//1.2判定之后,动态拼接检索条件if (condition.getEmpCity()!=null) {//用户填写了地址作为检索条件criteria.add(Restrictions.eq("empCtity", condition.getEmpCity()));}if(condition.getEmpId()!=null){//用户填写用户编号作为筛选条件criteria.add(Restrictions.gt("empId", condition.getEmpId()));}List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

(四)Order排序

复制代码
 /*** 1.9  排序   addOrder()* 查询工号大于0的员工,查询结果按员工 编号升序排列* */ @Testpublic void orderTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);Criterion criterion = Restrictions.gt("empId", 0);criteria.add(criterion).addOrder(Order.asc("empId"));List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

(五)分页

复制代码
 /*** 1.10 分页* Criteria接口提供了设置分页的方法setFirstResult(int firstResult)  起始记录的索引setMaxResult(int maxResult)  最大记录条数//10.分页  查询员工表中的4-6条数据,每页3条数据*/@Testpublic void pageListTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();Criteria criteria = session.createCriteria(Emp.class);//总记录数
          Projection projection = Projections.count("empId");criteria.setProjection(projection);Integer count = ((Long)criteria.uniqueResult()).intValue();System.out.println(count);//分页int pageSize=3;int pageIndex=2;criteria.setFirstResult((pageIndex-1)*pageSize);criteria.setMaxResults(pageSize);List<Emp> list = criteria.list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

(六)DetachedCriteria

复制代码
 /*** 1.11  DetachedCriteria和Criteria功能类似,它实现了CriteriaSpecification接口Criteria是由Session对象创建的DetachedCriteria创建时不需要Session对象使用DetachedCriteria来构造查询条件可以把DetachedCriteria作为方法参数传递给业务层* 查询开发部的员工* */ @Test  public void detachedCriteriaTest(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();//构建一个DetachedCriteria对象DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class);//别名detachedCriteria.createAlias("dept","d");//检索条件Criterion criterion = Restrictions.eq("d.deptName", "开发部");//绑定
           detachedCriteria.add(criterion);List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();for (Emp emp : list) {System.out.println(emp.getEmpName());}}
复制代码

 

    就此讲解到此,希望程序员的我们有收获!!!!友情提示HibernateUtil工具类

 

复制代码
package cn.happy.until;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;/*** 工具类* @author happy**/
public class HibernateUtil {//getCurrentSession()底层实现原理//ThreadLocal变量public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>();//我想直接调用一个方法,获取Session//定义一个sessionFactory对象private static SessionFactory factory;private static Configuration cfg;static{cfg=new Configuration().configure();factory=cfg.buildSessionFactory();}//提供一个静态方法public static Session currentSession(){Session session=threadTL.get();if(session==null){  //当前线程中没有session对象session=factory.openSession();threadTL.set(session);}return session;}//关闭sessionpublic static void closeSession(){//获取线程中的sessionSession session = threadTL.get();if (session!=null) {threadTL.set(null);session.close();}}}
转自http://www.cnblogs.com/yejiaojiao/p/5796279.html

http://chatgpt.dhexx.cn/article/ML6qkUHY.shtml

相关文章

第13章:处理Excel电子表格(笔记)

13.1&#xff1a;Excel文档 13.2&#xff1a;安装openpyxl模块 pip install --user --Uopenpuxl2.6.2 这是安装2.6.2版本的&#xff0c;比较新的版本与学习的书籍的信息有一点不兼容 13.3&#xff1a;读取Excel文档 13.3.1&#xff1a;用openpyxl模块打开Excel文档 import …

关于 range.autofilter 和 VBA的 filter

1 range().autofilter容易出错的地方 1.1 range().autofilter的返回值 range().autofilter 返回值总是 true返回值并不是对象&#xff0c;而是执行一个筛选的操作所以 Sub test1_filter5() Dim rng1 As Range Set rng1 Range("b1:b20").AutoFilter(field:1, Crit…

Opencv学习之角点检测

Opencv学习之角点检测 角点检测 在图像处理和计算机视觉领域&#xff0c;兴趣点&#xff08;interest points&#xff09;&#xff0c;也被称作关键点&#xff08;key points&#xff09;、特征点&#xff08;feture points&#xff09;。它被大量用于解决物体识别、图像识别…

VBA-Range.AutoFilter 方法浅析

VBA-Range.AutoFilter 方法的一些“坑” 学到筛选的时候遇到一些小小的“坑”&#xff0c;记录下。 录制出来的宏是这样的&#xff0c; Sub 宏1()宏1 宏Rows("1:1").SelectSelection.AutoFilterActiveSheet.Range("$A$1:$F$1048").AutoFilter field:4, …

Hibernate查询Query By Criterial

提供的检索方式&#xff1a;&#xff08;1&#xff09;导航对象图检索方式 &#xff08;2&#xff09;OID检索方式&#xff08;3&#xff09;HQL检索方式&#xff08;4&#xff09;QBC检索方式[query by Criteria(标准)]&#xff08;5&#xff09;本地SQL检索方式 1、简介 1.…

SLUB和SLAB的区别

转载&#xff1a;http://www.cnblogs.com/tolimit/ 首先为什么要说slub分配器&#xff0c;内核里小内存分配一共有三种&#xff0c;SLAB/SLUB/SLOB&#xff0c;slub分配器是slab分配器的进化版&#xff0c;而slob是一种精简的小内存分配算法&#xff0c;主要用于嵌入式系统。慢…

[linux kernel]slub内存管理分析(7) MEMCG的影响与绕过

文章目录 背景前情回顾描述方法约定 MEMCG总览省流总结简介 slub 相关 memcg机制kernel 5.9 版本之前结构体初始化具体实现 kernel 5.9-5.14kernel 5.14 之后 突破slab限制方法cross cache attackpage 堆风水 总结 背景 前情回顾 关于slab几个结构体的关系和初始化和内存分配…

linux slub分配器,Vi Linux内存 之 Slub分配器(六)

再来看内置式对象&#xff0c;如下图所示。指针位于对象的头部&#xff0c;与对象共用存储空间。这是因为对象被分配出去之前&#xff0c;其存储空间是空闲的可用状态&#xff0c;可用于存放空闲对象指针。对象被分配出去后&#xff0c;也不再需要这个指针了&#xff0c;可以被…

一文给你解决linux内存源码分析- SLUB分配器概述(超详细)

SLUB和SLAB的区别 首先为什么要说slub分配器&#xff0c;内核里小内存分配一共有三种&#xff0c;SLAB/SLUB/SLOB&#xff0c;slub分配器是slab分配器的进化版&#xff0c;而slob是一种精简的小内存分配算法&#xff0c;主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代&…

Linux内存管理(2):SLAB/SLUB系统(基于线性映射)

一、概述 伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux引入了基于对象的内存管理(或者叫内存区管理,Memory Area Management),就是SL…

slub分配器学习系列之linux5.10

前言 前一篇文章对 linux5.10 的 slab 分配器底层实现进行了探究与学习。进一步地&#xff0c;本篇文章将对 linux5.10 的 slub 分配器进行探究&#xff0c;对比看看两者的实现有何不同&#xff0c;做了哪些"必要的"改进。 slub 分配器 关于 slub 分配器的基本原理…

linux内核虚拟内存之slub分配器

上一章主要讲述以页为最小单位进行内存分配的伙伴管理算法&#xff0c;较大程度上避免了内存碎片问题。而实际上对内存的申请却不是每次都申请一个页面的&#xff08;比如文件节点&#xff0c;任务描述符等结构体内存&#xff09;&#xff0c;通常是远小于一个内存页面的大小&a…

4.19内核SLUB内存分配器

初始化 内核的大部分管理数据结构都是通过kmalloc分配内存的&#xff0c;那么slab本身结构的内存管理就出现了一个鸡与蛋的问题&#xff0c;slab数据结构所需内存远小于一整页的内存块&#xff0c;这些最适合kmalloc分配&#xff0c;而kmalloc只有在slab初始化完之后才能使用。…

SLUB内存管理之slub初始化

在讲slub内存管理涉及的四个函数之前&#xff0c;先从slub内存分配算法的初始化开始。系统启动时&#xff0c;会进行slub内存分配算法的初始化&#xff0c;函数流程是&#xff1a;start_kernel() -> mm_init()->kmem_cache_init()。在start_kernel()函数中的setup_arch()…

SLUB DEBUG原理

1. 前言 在工作中&#xff0c;经常会遇到由于越界导致的各种奇怪的问题。为什么越界访问导致的问题很奇怪呢&#xff1f;在工作差不多半年的时间里我就遇到了很多越界访问导致的问题&#xff08;不得不吐槽下IC厂商提供的driver&#xff0c;总是隐藏着bug&#xff09;。比如说…

slub allocator工作原理

前言 在Linux中&#xff0c;伙伴系统&#xff08;buddy system&#xff09;是以页&#xff08;1page等于4K&#xff09;为单位管理和分配内存。对于小内存的分配&#xff0c;如果还是使用伙伴系统进行内存分配&#xff0c;就会导致严重浪费内存。此时&#xff0c;slab分配器就应…

SLUB缓存管理

注&#xff1a;本文分析基于linux-4.18.0-193.14.2.el8_2内核版本&#xff0c;即CentOS 8.2 1、关于SLUB 目前大多数系统都不使用slab作为缓存的管理模式&#xff0c;转而使用slub&#xff0c;比如CentOS 7和8默认都是使用slub管理器。slub是基于slab的进一步优化改进&#x…

slub debug(linux4.16.1)

在命令行选项中添加slub_debugUFPZ&#xff0c;以使能相关检测功能&#xff0c;其含义如下&#xff1a; &#xff08;1&#xff09;U&#xff1a;跟踪该slab内存的相关属性&#xff0c;如其创建时所属的cpu、进程、时间 &#xff08;2&#xff09;F&#xff1a;开启sanity检查功…

linux内核内存管理slub

一、概述 linux内存管理核心是伙伴系统&#xff0c;slab&#xff0c;slub&#xff0c;slob是基于伙伴系统之上提供api&#xff0c;用于内核内存分配释放管理&#xff0c;适用于小内存&#xff08;小于&#xff11;页&#xff09;分配与释放&#xff0c;当然大于&#xff11;页…

内存管理 slub算法

内核管理页面使用了2个算法&#xff1a;伙伴算法和slub算法&#xff0c;伙伴算法以页为单位管理内存&#xff0c;但在大多数情况下&#xff0c;程序需要的并不是一整页&#xff0c;而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理&#xff0c;这就是s…