JPA Criteria 条件查询

news/2024/4/19 8:56:25/文章来源:https://blog.csdn.net/allway2/article/details/128117661

1. 概述

在本教程中,我们将讨论一个非常有用的 JPA 功能 — 条件查询。

它使我们能够在不执行原始SQL的情况下编写查询,并为我们提供了一些面向对象的查询控制,这是Hibernate的主要功能之一。标准 API 允许我们以编程方式构建标准查询对象,我们可以在其中应用不同类型的过滤规则和逻辑条件。

从Hibernate5.2开始,Hibernate标准API被弃用,新的开发集中在JPA标准API上。我们将探讨如何使用Hibernate和JPA来构建条件查询。

2. Maven 依赖项

为了说明 API,我们将使用参考 JPA 实现 Hibernate。

要使用 Hibernate,我们将确保将其最新版本添加到我们的pom.xml文件中:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId>   <version>5.3.2.Final</version>
</dependency>Copy

我们可以在这里找到最新版本的Hibernate。

3. 使用标准的简单示例

让我们首先看看如何使用条件查询检索数据。我们将了解如何从数据库中获取特定类的所有实例。

我们有一个Item类,它表示元组“ITEM”在数据库中:

public class Item implements Serializable {private Integer itemId;private String itemName;private String itemDescription;private Integer itemPrice;// standard setters and getters
}Copy

让我们看一个简单的条件查询,它将从数据库中检索“ITEM”的所有行:

Session session = HibernateUtil.getHibernateSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Item> cr = cb.createQuery(Item.class);
Root<Item> root = cr.from(Item.class);
cr.select(root);Query<Item> query = session.createQuery(cr);
List<Item> results = query.getResultList();Copy

上面的查询是如何获取所有项目的简单演示。让我们一步一步地看:

  1. 从会话工厂对象创建会话的实例
  2. 通过调用getCriteriaBuilder()方法创建 CriteriaBuilder的实例
  3. 通过调用CriteriaBuildercreateQuery()方法创建CriteriaQuery的实例
  4. 通过调用SessioncreateQuery() 方法创建查询实例
  5. 调用查询对象的getResultList() 方法,它给了我们结果

现在我们已经介绍了基础知识,让我们继续讨论条件查询的一些功能。

3.1. 使用表达式

CriteriaBuilder 可用于根据特定条件限制查询结果,方法是使用CriteriaQuery where() 方法并提供由 CriteriaBuilder 创建的表达式。

让我们看一些常用表达式的示例。

为了获得价格超过1000的商品:

cr.select(root).where(cb.gt(root.get("itemPrice"), 1000));Copy

接下来,获取项目价格低于 1000 的项目:

cr.select(root).where(cb.lt(root.get("itemPrice"), 1000));Copy

具有项目名称的项目包含主席

cr.select(root).where(cb.like(root.get("itemName"), "%chair%"));Copy

itemPrice介于 100 和 200 之间的记录:

cr.select(root).where(cb.between(root.get("itemPrice"), 100, 200));Copy

在滑板油漆胶水中具有项目名称的项目:

cr.select(root).where(root.get("itemName").in("Skate Board", "Paint", "Glue"));Copy

要检查给定属性是否为空,请执行以下操作:

cr.select(root).where(cb.isNull(root.get("itemDescription")));Copy

要检查给定的属性是否不为空,请执行以下操作:

cr.select(root).where(cb.isNotNull(root.get("itemDescription")));Copy

我们还可以使用 isEmpty() 和isNotEmpty() 方法来测试类中的List是否为空。

此外,我们可以结合上述两个或多个比较。标准 API 允许我们轻松地链接表达式

Predicate[] predicates = new Predicate[2];
predicates[0] = cb.isNull(root.get("itemDescription"));
predicates[1] = cb.like(root.get("itemName"), "chair%");
cr.select(root).where(predicates);Copy

添加两个具有逻辑运算的表达式:

Predicate greaterThanPrice = cb.gt(root.get("itemPrice"), 1000);
Predicate chairItems = cb.like(root.get("itemName"), "Chair%");Copy

具有上述定义条件的项目与逻辑 OR 连接:

cr.select(root).where(cb.or(greaterThanPrice, chairItems));Copy

要获取与上述定义条件匹配的项,请使用逻辑 AND 联接:

cr.select(root).where(cb.and(greaterThanPrice, chairItems));Copy

3.2. 排序

现在我们知道了标准的基本用法,让我们看一下标准的排序功能。

在下面的示例中,我们按名称的升序排列列表,然后按价格降序对列表进行排序:

cr.orderBy(cb.asc(root.get("itemName")), cb.desc(root.get("itemPrice")));Copy

在下一节中,我们将了解如何执行聚合函数。

3.3. 投影、聚合和分组函数

现在让我们看看不同的聚合函数。

获取行计数:

CriteriaQuery<Long> cr = cb.createQuery(Long.class);
Root<Item> root = cr.from(Item.class);
cr.select(cb.count(root));
Query<Long> query = session.createQuery(cr);
List<Long> itemProjected = query.getResultList();Copy

以下是聚合函数的示例 -平均值聚合函数:

CriteriaQuery<Double> cr = cb.createQuery(Double.class);
Root<Item> root = cr.from(Item.class);
cr.select(cb.avg(root.get("itemPrice")));
Query<Double> query = session.createQuery(cr);
List avgItemPriceList = query.getResultList();Copy

其他有用的聚合方法有sum(),max(),min(),count()等。

3.4.标准更新

从 JPA 2.1 开始,支持使用条件API 执行数据库更新。

CriteriaUpdate有一个set() 方法,可用于为数据库记录提供新值:

CriteriaUpdate<Item> criteriaUpdate = cb.createCriteriaUpdate(Item.class);
Root<Item> root = criteriaUpdate.from(Item.class);
criteriaUpdate.set("itemPrice", newPrice);
criteriaUpdate.where(cb.equal(root.get("itemPrice"), oldPrice));Transaction transaction = session.beginTransaction();
session.createQuery(criteriaUpdate).executeUpdate();
transaction.commit();Copy

在上面的代码片段中,我们从CriteriaBuilder创建一个CriteriaUpdate<Item> 的实例,并使用其set() 方法为itemPrice 提供新值。为了更新多个属性,我们只需要多次调用set() 方法。

3.5.条件删除

条件删除启用使用条件API 的删除操作。

我们只需要创建一个CriteriaDelete的实例并使用where() 方法来应用限制:

CriteriaDelete<Item> criteriaDelete = cb.createCriteriaDelete(Item.class);
Root<Item> root = criteriaDelete.from(Item.class);
criteriaDelete.where(cb.greaterThan(root.get("itemPrice"), targetPrice));Transaction transaction = session.beginTransaction();
session.createQuery(criteriaDelete).executeUpdate();
transaction.commit();Copy

4. 优于 HQL 的优势

在前面的部分中,我们介绍了如何使用条件查询。

显然,与 HQL 相比,标准查询的主要和最强大的优势是漂亮、干净、面向对象的 API。

与普通 HQL 相比,我们可以简单地编写更灵活、更动态的查询。该逻辑可以使用 IDE 进行重构,并具有 Java 语言本身的所有类型安全优势。

当然,也有一些缺点,尤其是在更复杂的连接周围。

因此,我们通常必须使用最适合工作的工具——在大多数情况下,这可能是标准 API,但肯定在某些情况下,我们将不得不降低级别。

5. 结论

在本文中,我们重点介绍了 Hibernate 和 JPA 中标准查询的基础知识以及 API 的一些高级功能。

此处讨论的代码在GitHub 存储库中可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_39225.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM运行时数据 堆

JVM运行时数据 堆快速调试堆参数设置堆分类运行流程Minor GC、Major GC与Full GC分代思想内存分配策略TLAB堆空间参数设置快速调试 一个JVM实例只存在一个堆内存&#xff0c;对也是Java内存管理的核心区域Java 堆区在Jvm启动的时候创建&#xff0c;其空间大小也就确定了。是JV…

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发&#xff0c;效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

分层架构理论基础

一、三层架构 1、什么是三层架构 三层架构&#xff08;3-tier architecture&#xff09;通常意义上的三层架构就是将整个业务应用划分为&#xff1a;表示层&#xff08;User Interface layer&#xff09;、业务逻辑层&#xff08;Business Logic Layer&#xff09;、数据访问层…

数仓之hive自定义UDTF函数详解

学习目录一、自定义UDTF函数一、自定义UDTF函数 1.说明文档 A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the initialize, process, and possibly close methods. The initialize method is called by Hive to notify t…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统&#xff0c;打开hadoop2.修…

高效率开发Web安全扫描器之路(一)

一、背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞&#xff0c;一直好奇它们怎么能挖到这么多漏洞&#xff0c;开始还以为它们不上班除了睡觉就挖漏洞&#xff0c;后来有机会认识了一些大佬&#xff0c;发现它们大部分漏洞其实是通过工具挖掘的&#xff0c;比如说下…

安卓版微信8.0.31内测版出炉:安装包变小,功能变多!

人是社会性生物&#xff0c;建立依恋、经营亲密关系是人的本能&#xff0c;只不过到了网络时代之后&#xff0c;用户进行交流的方式几乎都变成了微信等社交软件。 不仅可以让用户很便捷的和朋友进行沟通&#xff0c;并且在上班办公的时候&#xff0c;也是可以轻松传输文件等&a…

MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

一、准备工作 首先需要准备好环境&#xff0c;包含必要的软件&#xff0c;痞子衡的环境如下&#xff1a; 集成开发环境&#xff1a; MCUXpresso IDE_11.6.0_8187&#xff0c;点此下载软件开发包&#xff1a; SDK_2.12.1_EVK-MIMXRT1170&#xff08;Toolchain需包含MCUXpresso I…

Compose学习-> Text()

设置文本&#xff1a;text xxx 直接设置 Text(text "我是一个Text")引用资源文件&#xff1a;stringResource Text(text stringResource(id R.string.string_text))设置字体颜色&#xff1a;color xxx 引用系统自带的颜色 Text(text "我是一个Text"…

【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实物图答辩论文答辩PPT&#xff09; 文章目录typora-root-url: ./【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实…

C++习题2

指针调用数组元素 指针调用数组元素 int a[3][4] {{1,4,7,10},{2,5,8,11},{3,6,9,12}};int* pa[3] { a[0],a[1],a[2] };int(*pb)[4]; pb a;int** q pa;cout << *(a[2] 3)<<endl;cout << *(*(pa 2) 3)<<endl;cout << pb[2][3]<<en…

【JavaWeb】Filter

文章目录1.Filter过滤器2.Filter的初体验3.Filter的生命周期4.FilterConfig类5.FilterChain过滤器链6.Filter的拦截路径1.Filter过滤器 (1).概念及作用 Filter过滤器是JavaWeb的三大组件之一三大组件分别是:Servlet程序,Listener监听器,Filter过滤器Filter过滤器是JavaEE的规…

MBA管理类联考英语二题型答题时间及次序问题

还有不到一个月时间&#xff0c;2023年MBA联考也进入到最后的收官阶段&#xff0c;这个阶段对于多数已经系统复习过的考生&#xff0c;一般需要进行通盘梳理备考&#xff0c;而不是专注于单个模块的复习。在做试卷或真题的过程中&#xff0c;如何才能更有利于分数这个问题需要大…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话&#xff1a;又一年快过去了&#xff0c;回想刚刚开始在CSDN上写笔记&#xff0c;还是2年前的事情。闲人其实是一个拖延症十分严重的人&#xff0c;自从开始走上写作这条路之后&#xff0c;治疗拖延症找到了办法&#xff0c;每天总有一些事情让闲人去思考&#xff0c;然…

Miniconda:在pycharm的terminal中无法使用Conda命令

在pycharm的terminal中无法使用Conda命令 问题&#xff1a; 在本地下载好conda系列后&#xff0c;在pycharm的terminal中无法使用conda命令 问题分析&#xff1a; 说的很清楚了&#xff0c;是因为当前支持的shells没有初始化conda 所以我们只需要把Shell 路径改成激活cond…

如何制作一个微信小程序【微信小程序是怎么做的】

为什么现在这么多人使用微信小程序呢&#xff1f;因为微信小程序除了便捷易开发&#xff0c;公司企业可以用来做小程序展示官网&#xff0c;商家也可以做小程序商城&#xff0c;甚至个人也可以拥有自己的小程序。那么如何制作一个微信小程序&#xff1f;微信小程序是怎么做的呢…

基于微信小程序奶茶店在线点单管理系统ssm框架-计算机毕业设计

面对目前奶茶店林立的现状&#xff0c;大城市奶茶店多为连锁奶茶店他们都有统一的管理和相应的系统。但是个别小县城和小城以及城区也有不少的奶茶店多为自营&#xff0c;这就必须店长自己管理和采购原料。大型连锁的奶茶店管理系统就不适用于分散的小型奶茶店。小型奶茶店的管…

vue开发测评系统思路及踩坑

最近公司做了一个测评系统&#xff0c;因为时间很短&#xff0c;本以为会很简单&#xff0c;没有想到踩了很多坑。 先看下部分效果图吧 然后在说下需求 1&#xff1a;所有的答案都是动态的&#xff08;例如选择是出来的是第二题&#xff0c;选择否出来的是第五题&#xff09…

如何用蓝牙实现无线定位(二)--信号塔设置

1. 配置BLE4.0模块 根据三点定位原理&#xff0c;本项目需要使用3个信号塔。3个信号塔的主体均为BLE4.0模块&#xff0c;需要把BLE4.0模块的AT指令设置为“从设备”。 方法为&#xff1a; &#xff08;1&#xff09;给控制板刷一套空的程序。初始打开arduino IDE或新建&#x…