从零开始 Spring Boot 66:JPA 查询参数

news2024/11/13 12:39:19

从零开始 Spring Boot 66:JPA 查询参数

spring boot

图源:简书 (jianshu.com)

JPA 的查询参数分为两种:

  • 命名参数(Named Parameters)
  • 位置参数(Positional Parameters)

类似于 Python 中的函数的位置参数和指名参数。

本文的示例使用下面的实体类:

@Entity
public class Student {
    private static final int MAX_SCORE = 100;
    private static final int MIN_SCORE = 0;

    public enum Type {
        MIDDLE_SCHOOL_STUDENT,
        HIGH_SCHOOL_STUDENT,
        COLLEGE_STUDENT
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Length(max = 45)
    @NotBlank
    @NotNull
    @Column(unique = true)
    private String name;

    @NotNull
    private Type type;

    @NotNull
    @Min(MIN_SCORE)
    @Max(MAX_SCORE)
    private Integer mathScore;

    @NotNull
    @Min(MIN_SCORE)
    @Max(MAX_SCORE)
    private Integer englishScore;

    @NotNull
    @Min(MIN_SCORE)
    @Max(MAX_SCORE)
    private Integer chineseScore;
}

位置参数

位置参数由?+数字构成。

直接看示例:

List<Student> students = session.createQuery("select s from Student s where s.chineseScore>=?1" +
                                             " and s.mathScore>=?2" +
                                             " and s.englishScore>=?3", Student.class)
    .setParameter(1, 50)
    .setParameter(2, 60)
    .setParameter(3, 70)
    .getResultList();
students.forEach(s -> {
    System.out.println(s);
});

JPQL 中的?1表示位置为1的参数,该参数由setParameter(1, ...)设置参数值。

位置参数同样可以在原生 SQL 中使用:

List<Student> students = session.createNativeQuery("select * from student as s where s.chinese_score>=?1" +
                                                   " and s.math_score>=?2" +
                                                   " and s.english_score>=?3", Student.class)
    .setParameter(1, 50)
    .setParameter(2, 60)
    .setParameter(3, 70)
    .getResultList();

命名参数

命名参数由:+参数名称构成。

示例:

String searchName = "icexmoon";
var student = session.createQuery("select s from Student s where s.name=:name", Student.class)
    .setParameter("name", searchName)
    .getSingleResult();

可以调用Query.setParameter并结合参数名称来设置参数值。

同一个名称的参数可以在 JPQL 中使用多次:

var students = session.createQuery("select s from Student s where s.mathScore>=:minScore" +
                                   " and s.englishScore>=:minScore" +
                                   " and s.chineseScore>=:minScore", Student.class)
    .setParameter("minScore", 70)
    .getResultList();

当然值只需要设置一次。

命名参数同样可以在 Hibernate 的原生 SQL 上使用:

String searchName = "icexmoon";
var student = session.createNativeQuery("select * from student as s where s.name=:name", Student.class)
    .setParameter("name", searchName)
    .getSingleResult();

不过 JPA 本身并没有要求原生 SQL 必须支持命名参数,所以 Hibernate 的原生 SQL 支持命名参数并不代表所有的 JPA 实现都支持。

集合参数

无论是位置参数还是命名参数,都可以使用集合作为参数值:

var students = session.createQuery("select s from Student s where s.type in :types", Student.class)
    .setParameter("types", List.of(Student.Type.HIGH_SCHOOL_STUDENT, Student.Type.COLLEGE_STUDENT))
    .getResultList();

条件查询参数

在条件查询(Criterial Query)中同样可以定义参数:

var cb = sessionFactory.getCriteriaBuilder();
JpaCriteriaQuery<Object> query = cb.createQuery();
JpaRoot<Student> root = query.from(Student.class);
JpaParameterExpression<String> nameParam = cb.parameter(String.class);
JpaParameterExpression<Integer> minScoreParam = cb.parameter(Integer.class);
query = query.select(root)
    .where(cb.and(cb.equal(root.get("name"), nameParam),
                  cb.ge(root.get("chineseScore"), minScoreParam),
                  cb.ge(root.get("mathScore"), minScoreParam),
                  cb.ge(root.get("englishScore"), minScoreParam)));
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.createQuery(query)
    .setParameter(nameParam, "icexmoon")
    .setParameter(minScoreParam, 60)
    .getSingleResult();
System.out.println(student);
transaction.commit();
session.close();

这里需要用HibernateCriteriaBuilder.parameter方法创建JpaParameterExpression对象作为条件查询中的参数对象,该对象可以用于HibernateCriteriaBuilder.geHibernateCriteriaBuilder.equal这样的 API 构建条件语句,也可以用于Query.setParamter方法的参数来设置执行查询时的参数值。

The End,谢谢阅读。

可以从这里获取本文的完整实例代码。

参考资料

  • JPA Query Parameters Usage | Baeldung

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的网络配置与远程连接与文件传输

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 网络配置 1、ifconfig查看网络信息 2、与网卡相关的配置文件 3、查询计算机的网络状态 4、systemctl启动/重启/停止网络 Linux远程连接与文件传输 1、为什么需要远程连接 2、SSH协议 3、sshd服务 4、…

2023CCF CAT- 热身赛

NOIP普及组 字符串 排序2017 动态规划 递推 USACO 2001 贪心 牛客小白月赛12 说实话还是很喜欢打比赛&#xff0c;喜欢AC的感觉&#xff0c;但是这玩意咋越来越难了那。。。。。 扎心了&#xff0c;不是~~~~~ 当个爱好吧&#xff0c;还是很喜欢当年打比赛和队友相视一笑的样子…

宇凡微2.4g无线合封芯片,高集成内置九齐单片机

2.4GHz是指一段频率范围&#xff0c;用来表示无线通信中的特定频率范围。在无线传输产品和设备中&#xff0c;2.4GHz被广泛应用&#xff0c;用于传输固定频率的波形以实现接收和发射功能。 需要注意的是&#xff0c;2.4GHz和蓝牙功能在基本上是相似的&#xff0c;但并不是所有…

前端面试刷题整理

第一题&#xff1a;es6 class语法 题目&#xff1a;现有三种菜单&#xff0c;button属性&#xff0c;select属性&#xff0c;model属性 class Mune{constructor(title,icon){this.title titlethis.icon icon}isDisabled(){return false}exec(){} } class Button extends Mun…

LeakTracer代码学习(1)

项目中有的时候会产生内存泄漏&#xff0c;以往的经验&#xff0c;检测工具更倾向于使用LeakTracer进行检测泄漏问题&#xff0c;但是直接使用会有些问题&#xff0c;比如堆栈不全都是??等问题&#xff0c;该专题希望自己能够坚持将LeakTracer的源码梳理清楚&#xff0c;以供…

ModaHub魔搭社区:RESTful API 的方式访问全球领先的向量数据库Milvus

目录 Insert CreateIndex and Load Search or Query 作为全球领先的开源向量数据库,Milvus 一直致力于满足不同用户的场景和需求,聆听社区的声音。 最近, 我们发现,很多用户的数据中 常常包含各种不确定类型的数据,也有用户提出希望以 RESTful API 的方式访问 Milvus。…

【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(三)

贴接上回。。。 【往期FAQ参考】 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答&#xff08;一&#xff09; 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答&#xff08;二&#xff09; 【本期FAQ】 1、第一次调用geolocation.getCurrentLocation()接口&#xff…

一份非常牛逼的计算机相关技术资料整理

最近发现GitHub上一个非常牛逼的项目。作者收录了一整套 计算机相关的技术资料整理。 收录内容包括&#xff0c;但不仅仅包括&#xff0c;比如比较实用的计算机相关技术书籍&#xff0c;可以在短期之内入门的简单实用教程、一些技术网站以及一些写的比较好的博文。真的得给作者…

postman测试传参格式

postman测试传参格式 创建User实体 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class User {private Integer id;private String name; }接口参数是集合 PostMapping("…

大规模语言模型剪枝又一力作,比SparseGPT还快300倍!

©Paperweekly 原创 作者 | An. 单位 | 中科院自动化所 研究方向 | 计算机视觉、模型压缩 DenseNet、ConvNeXt、Network Slimming 一作刘壮研究员的剪枝新工作&#xff0c;针对 LLMs 特点设计的极低成本无需微调的剪枝算法&#xff0c;耗时接近幅值剪枝&#xff0c;性能表…

基于Spring Boot的高校实验室信息管理系统设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校实验室信息管理系统设计与实现&#xff08;Javaspring bootMySQLVUE&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 后端&#xff1a;Java springboot…

玩转ChatGPT:Code interpreter (vol. 1)

一、写在前面 喜大普奔&#xff0c;GPT-4传说中的Code interpreter插件已经可以用了&#xff01;&#xff01;&#xff01; 二、什么是Code interpreter 代码解释器&#xff08;Code Interpreter&#xff09;是一个工具&#xff0c;它能够读取和执行编程代码。这里有几个主要…

程序请求报错java.lang.NoSuchMethodError

[23-7-3 9:09:19:069 CST] 00000017 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E:应用程序 east5_20230629_war 中 servlet XXX 的某一服务方法创建了未捕获到的异常。 创建的异常&#xff1a;org.springframework.web.util.NestedServ…

Android 短视频直播特效,音视频图像处理 FFmepg OpenGLES OpenCV开发详细内容

1 音视频开发基础 2 Android OpenGL ES开发基础 3 Android FFmpeg OpenGLES 音视频播放器核心开发 4 Android FFmpeg H.264 AAC 封装mp4 5 Android OpenCV 机器学习人脸标定SDK开发实战 6 Android OpenCV 开发实践 7 Android 短视频App FFmpeg OpenGL ES OpenCV人脸特效渲…

python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)

python pytorch 纯算法实现前馈神经网络训练&#xff08;数据集随机生成&#xff09; 下面这个代码大家可以学习学习&#xff0c;这个代码难度最大的在于反向传播推导&#xff0c; 博主推了很久&#xff0c;整个过程都是纯算法去实现的&#xff0c;除了几个激活函数&#xff0…

【前端知识】React 基础巩固(十八)——组件化开发(二)

React 基础巩固(十八)——组件化开发&#xff08;二&#xff09; 生命周期 生命周期是一个抽象的概念&#xff0c;在生命周期的整个过程中&#xff0c;分成了很多个阶段 比如装载阶段&#xff08;Mount&#xff09;&#xff0c;组件第一次在 DOM 树中被渲染的过程比如更新过程…

【C语言】你知道浮点数是怎么存储的吗?

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 积学以储宝&#xff0c;酌…

Debian 11 x64 安装 MySQL 8.0.33

更新 sudo apt update sudo apt install gnupg安装 DEB Package wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb sudo dpkg -i mysql-apt-config_0.8.25-1_all.deb具体版本见官方网站&#xff1a;MySQL Community Downloads&#xff0c;这里仅以版本 …

详解什么是新零售和新零售的四种商业模式

前言 自推出新零售概念以来&#xff0c;新零售已成为当前的热门话题。今天我们将进一步了解什么是新零售。 一、什么是新零售? 新零售&#xff0c;英文是New Retailing&#xff0c;即企业以互联网为依托&#xff0c;通过运用大数据、人工智能等先进技术手段&#xff0c;对商…

VMware虚拟机里的Ubuntu通过主机的代理联网

问题描述&#xff1a;主机win10&#xff0c;通过代理联网。主机里装有VMware的虚拟机Ubuntu&#xff0c;想要通过主机的代理进行上网。 步骤&#xff1a; 1 将虚拟机的网络设置为NAT模式。 2 在win10命令行中输入ipconfig&#xff0c;查询ipv4的局域网地址。&#xff08;注&…