68、Spring Data JPA 的 方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)
2、@Query查询(半自动:提供 SQL 或 JPQL 查询)
3、自定义查询(全手动)

★ 方法名关键字查询(全自动)

(1)继承 CrudRepository 接口 的 DAO 组件可按特定规则来定义查询方法,只要这些查询方法的 方法名 遵守特定的规则,Spring Data 将会自动为这些方法生成 查询语句、提供 方法实现体。(2)方法名关键字的查询方法能以 find...By、read...By、query…By、count…By(查询记录的条数)、get…By开头,并在方法名中嵌入特定关键字即可,Spring Data就会自动生成相应的查询方法体。

▲ 关键字规则

 在方法名中将属性名、运算符都设计成关键字,比如如下:- findByName(String name),这表明根据name属性执行查询。- findByAgeGreaterThan(int age):表明查询age属性大于指定值的记录。

▲ 关键字方法中同样可定义Pagable、Sort参数,用于控制分页和排序。

 说明:如果要做分页或排序的查询,其实没必须要去继承PagingAndSortingRepository,继承CrudRepository也是可行的

▲ 需要说明的情况:

 一种情况需要说明,对比如下两个方法:- findByAddressAndZip:该方法要根据address和zip两个属性进行查询,它对应的JPQL片段为:... where x.address = ?1 and zip = ?2。- findByAddressZip:留意该方法名的Address和Zip之间既没有And,也没有Or,那就表明用的是“属性路径”方式,表明该方法要根据address属性的zip属性进行查询,它对应的JPQL片段为:... where x.address.zip = ?1。如果你的方法名中的关键字写错了,往往就会报QueryCreateException。

代码演示:

数据库数据

在这里插入图片描述

创建对应的两个实体类。
Student实体类
这节用到的一些类和配置文件
在这里插入图片描述

Clazz 实体类
在这里插入图片描述

//根据班级名称查询对象–ClazzDao

方法
在这里插入图片描述
测试结果
在这里插入图片描述

//根据班级名称模糊查询–ClazzDao

方法:
在这里插入图片描述

测试结果
在这里插入图片描述

查询年龄大于指定参数的学生–StudentDao

方法:
在这里插入图片描述

测试结果:
在这里插入图片描述

根据年龄和班级名称查询学生–StudentDao

在这里插入图片描述

方法:
在这里插入图片描述

测试结果:

在这里插入图片描述

根据地址后缀进行分页查询,查询 address 带有 “洞” 的学生并进行分页 – StudentDao

在这里插入图片描述

结果:
在这里插入图片描述
在这里插入图片描述

完整代码

Student

package cn.ljh.app.domain;import lombok.Getter;
import lombok.Setter;import javax.persistence.*;/*** strategy:策略 , GenerationType:生成类型  , Column:列*///修饰该类成为实体类
@Entity
@Getter
@Setter
//表示该类映射到数据库的student_inf表
@Table(name = "student_inf")
public class Student
{@Id //设置为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增策略@Column(name = "student_id") //该属性名映射到数据库表的列名private Integer id;private String name;private int age;private String address;private char gender;//关联关系,多个学生对应一个教室//targetEntity:指定关联实体的类型,不指定也没问题,底层会通过反射去识别@ManyToOne(targetEntity = Clazz.class)//JoinColumn: name = "clazz_code"  ,映射外键列列名 ,这个"clazz_code "是指映射的 Clazz 类中的成员变量//referencedColumnName = "clazz_code" ,这个"clazz_code" 是指表的列名//referencedColumnName: --> name = "clazz_code"这个外键列名引用到对方的数据表(clazz_inf)的列名叫"clazz_code"@JoinColumn(name = "clazz_code",referencedColumnName = "clazz_code")private Clazz clazz;@Overridepublic String toString(){return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +", gender=" + gender +'}';}
}

Clazz

package cn.ljh.app.domain;import lombok.Getter;
import lombok.Setter;import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;@Entity //修饰该类为实体类
@Table(name = "clazz_inf") //该实体类映射到数据库的 clazz_inf 表
@Getter
@Setter
public class Clazz
{@Id//主键id@Column(name = "clazz_code") //表示这个属性在数据库表中的列名叫这个clazz_code@GeneratedValue(strategy = GenerationType.IDENTITY) //主键id的自增策略private Integer clazz_code; //班级号private String name;  //班级名称//关联关系,一个教室对应多个学生//targetEntity:指定关联实体的类型,不指定也没问题,底层会通过反射去识别//mappedBy 属性(clazz) 关联实体(Student)中,哪个属性(student.clazz)引用到当前实体(Student实体)@OneToMany(targetEntity = Student.class,mappedBy = "clazz")private Set<Student> students = new HashSet<>();@Overridepublic String toString(){return "Clazz{" +"clazz_code=" + clazz_code +", name='" + name + '\'' +'}';}
}

ClazzDao

package cn.ljh.app.dao;import cn.ljh.app.domain.Clazz;
import org.springframework.data.repository.CrudRepository;import java.util.List;//CrudRepository 的第一个泛型参数是被操作的实体类型,第二个参数是实体的主键类型
//方法名关键字查询: Spring Data 会自动生成查询语句、生成查询方法体
public interface ClazzDao extends CrudRepository<Clazz, Integer>
{//根据班级名称查询对象Clazz findByName(String name);//根据班级名称模糊查询List<Clazz> findByNameLike(String namePattern);}

StudentDao

package cn.ljh.app.dao;import cn.ljh.app.domain.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;import java.util.List;//CrudRepository 的第一个泛型参数是被操作的实体类型,第二个参数是实体的主键类型
public interface StudentDao extends CrudRepository<Student,Integer>
{//查询年龄大于指定参数的学生List<Student> findByAgeGreaterThan(int startAge);//根据年龄和班级名称查询学生//Age 和 ClazzName 用 And 连接起来,表示两个查询条件,//ClazzName这两个单词中间没有And连接起来,表示是一个路径写法,表示是Clazz类的name属性List<Student> findByAgeAndClazzName(int age , String clazzName);//根据地址后缀进行分页查询,查询 address 带有 "洞" 的学生并进行分页Page<Student> findByAddressEndingWith(String addrSuffix, Pageable pageable);}

ClazzDaoTest

package cn.ljh.app.dao;import cn.ljh.app.domain.Clazz;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;//SpringBootTest.WebEnvironment.NONE : 表示不需要web环境
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class ClazzDaoTest
{@Autowiredprivate ClazzDao clazzDao;//参数化测试@ParameterizedTest//参数只有一个的测试用 @ValueSource//根据班级名称查询对象@ValueSource(strings = {"超级A营","超级B班","aaa"})public void testFindByName(String name){Clazz clazz = clazzDao.findByName(name);System.err.println(clazz);}@ParameterizedTest//根据班级名称模糊查询@ValueSource(strings = {"超级%","%营"})public void testFindByNameLike(String namePattern){List<Clazz> clazzes = clazzDao.findByNameLike(namePattern);clazzes.forEach(System.err::println);}}

StudentDaoTest

package cn.ljh.app.dao;import cn.ljh.app.domain.Student;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;import java.util.List;//SpringBootTest.WebEnvironment.NONE : 表示不需要web环境
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class StudentDaoTest
{@Autowiredprivate StudentDao studentDao;/*** @ValueSource: 每次只能传一个参数* @CsvSource:每次可以传多个参数*///需求:查询年龄大于指定参数的记录//参数化测试@ParameterizedTest@ValueSource(ints = {20, 200})public void testFindByAgeGreaterThan(int startAge){List<Student> students = studentDao.findByAgeGreaterThan(startAge);students.forEach(System.err::println);}//根据年龄和班级名称查询学生//Age 和 ClazzName 用 And 连接起来,表示两个查询条件,//ClazzName这两个单词中间没有And连接起来,表示是一个路径写法,表示是Clazz类的name属性@ParameterizedTest//参数一个是int,一个是String,这个注解在传参的时候会自动进行类型转换@CsvSource(value = {"20,超级A营", "18,超级D班"})public void testFindByAgeAndClazzName(int age, String clazzName){List<Student> students = studentDao.findByAgeAndClazzName(age, clazzName);students.forEach(System.err::println);}//pageNo: 要查询哪一页的页数 , pageSize: 每页显示的条数@ParameterizedTest@CsvSource({"洞,2,3","洞,1,4","洞,3,2"})public void testFindByAddressEndingWith(String addrSuffix, int pageNo, int pageSize){//分页对象,此处的pageNo是从0开始的,0代表第一页,所以这里的 pageNo 要 -1Pageable pageable1 = PageRequest.of(pageNo - 1, pageSize);Page<Student> students = studentDao.findByAddressEndingWith(addrSuffix, pageable1);int number = students.getNumber() + 1;System.err.println("总页数:" + students.getTotalPages());System.err.println("总条数:" + students.getTotalElements());System.err.println("当前第:" + number + " 页");System.err.println("当前页有:" + students.getNumberOfElements() + " 条数据");students.forEach(System.err::println);}
}

application.properties

# 配置连接数据源,这些配置由 DataSourceProperties 类负责处理---
# SpringBoot 读取到这些配置信息后,会使用 AutoConfiguration 去容器中自动配置 DataSource Bean
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456# 针对 HikariCP 进行详细配置---
# 指定连接池最大只能有20个连接
#spring.datasource.hikari.maximum-pool-size=20# 配置 JPA 相关属性,由 JpaProperties 类负责处理---
# SpringBoot 读取到这些配置信息后,会使用 AutoConfiguration 去容器中自动配置 EntityManagerFactory Bean
# JPA 底层就是依赖这个 EntityManagerFactory# 自动建表,只能true或者false
# spring.jpa.generate-ddl=true
# 这个也是自动建表,不过比spring.jpa.generate-ddl更严谨,作用:如果已有数据表,无需创建,否则创建数据表
spring.jpa.hibernate.ddl-auto=update
# 指定操作的数据库
spring.jpa.database=mysql
# 是否在执行的时候显示sql语句
spring.jpa.show-sql=true

db.sql

drop database springboot;
create database springboot;
use springboot;
-- 创建clazz_inf表
create table clazz_inf
(clazz_code int primary key auto_increment,name varchar(255)
);
-- 创建student_inf表
create table student_inf
(student_id int primary key auto_increment,name varchar(255),age int,address varchar(255),gender char(2),clazz_code int,foreign key(clazz_code) references clazz_inf(clazz_code)
);
-- 向clazz_inf表插入数据
insert into clazz_inf
values
(null, '疯狂Java训练营'),
(null, '疯狂Java就业班'),
(null, '疯狂Java基础班'),
(null, '疯狂Java提高班');-- 向student_inf表插入数据
insert into student_inf
values
(null, '孙悟空', 500, '花果山水帘洞', '男', 1),
(null, '牛魔王', 800, '积雷山摩云洞', '男', 1),
(null, '猪八戒', 600, '福陵山云栈洞', '男', 2),
(null, '沙和尚', 580, '流沙河', '男', 3),
(null, '白鼠精', 23, '陷空山无底洞',  '女', 2),
(null, '蜘蛛精', 18, '盘丝岭盘丝洞', '女', 4),
(null, '玉面狐狸', 21, '积雷山摩云洞', '女', 3),
(null, '杏仙', 19, '荆棘岭木仙庵', '女', 4);

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version></parent><groupId>cn.ljh</groupId><artifactId>spring_data_jpa_keyword</artifactId><version>1.0.0</version><name>spring_data_jpa_keyword</name><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

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

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

相关文章

简明 SQL 组合查询指南:掌握 UNION 实现数据筛选

在SQL中&#xff0c;组合查询是一种将多个SELECT查询结果合并的操作&#xff0c;通常使用UNION和UNION ALL两种方式。 UNION 用于合并多个查询结果集&#xff0c;同时去除重复的行&#xff0c;即只保留一份相同的数据。UNION ALL 也用于合并多个查询结果集&#xff0c;但不去除…

3D模型格式转换工具HOOPS Exchange与iBase-t的Solumina集成:支持用户查询与编辑模型

iBase-t是一家软件公司&#xff0c;致力于简化复杂产品的构建和维护。iBase-t 于 1986 年在南加州成立&#xff0c;提供的解决方案可确保全球范围内制造、质量以及维护、修理和大修 (MRO) 运营的数字连续性。iBase-t 的 Solumina 制造运营平台是一种云原生解决方案&#xff0c;…

PX4 通过 Vision 实现 Position、Altitude 和 Offboard 模式

本文通过 VINS-Fusion 的里程计信息为 PX4 提供视觉信息&#xff0c;从而达到 视觉定高和定点 的目的 主要工作为创建一个将 vins 里程计信息发布给 Mavros 的 /mavros/vision_pose/pose 话题 首先创建一个工作空间 mkdir -p ~/catkin_ws/src/vision_to_mavros/src/ cd ~/ca…

贝叶斯滤波计算4d毫米波聚类目标动静属性

机器人学中有些问题是二值问题&#xff0c;对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门&#xff0c;机器人想判断这个门是开是关。这个二值状态是固定的&#xff0c;并不会随着测量数据变量的改变而改变。就像门…

企业架构LNMP学习笔记46

PHP测试连接代码&#xff1a; php代码测试使用memcached&#xff1a; 示例代码&#xff1a; <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…

python基于轻量级卷积神经网络模型开发构建眼疾识别系统

常见的眼疾包括但不限于以下几种&#xff1a; 白内障&#xff1a;白内障是眼睛晶状体变得模糊或不透明&#xff0c;导致视力下降。它通常与年龄相关&#xff0c;但也可以由其他因素引起&#xff0c;如遗传、外伤、糖尿病等。 青光眼&#xff1a;青光眼是一组引起视神经损伤的眼…

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

DC/DC开关电源学习笔记(十)Buck降压电路仿真及工程应用实例

(十)Buck降压电路仿真及工程应用实例 1. 仿真应用实例1.1 案例一1.2 案例二2. 工程应用实例2.1 数字DC/DC应用实例2.2 模拟DC/DC应用实例1. 仿真应用实例 1.1 案例一 仿真技术要求输入:输入电压30~90V,输出电压28V,输出电流最大10A,开关频率100KHz。我们按照参数极限工…

【Vue】使用vue-cli搭建SPA项目的路由,嵌套路由

一、SPA项目的构建 1、前期准备 我们的前期的准备是搭建好Node.js,测试&#xff1a; node -v npm -v2、利用Vue-cli来构建spa项目 2.1、什么是Vue-cli Vue CLI 是一个基于 Vue.js 的官方脚手架工具&#xff0c;用于自动生成vue.jswebpack的项目模板&#xff0c;它可以帮助开发者…

Qt(day5)

思维导图 将登录操作和数据库绑定 mywnd.h #ifndef MYWND_H #define MYWND_H#include <QMainWindow> #include<QLabel> #include<QLineEdit> #include<QPushButton> #include<QDebug> #include<QMessageBox> #include"second.h&qu…

零基础转行网络安全可以做什么工作,内附网络安全自学路线

一直在说网络安全行业好就业、薪资高、前景也好&#xff0c;但是大家对网络安全这个行业具体做什么工作可能还一知半解。所以今天来跟大家聊聊&#xff0c;网络安全学完可以找到什么样的工作&#xff0c;顺便把不同岗位的不同技术要求也说一下。 【点击文章末尾卡片&#xff0…

Spring Security 对请求的处理流程

文章目录 前言系统启动Spring Security 对请求的处理总结 前言 分析Spring Security的核心原理&#xff0c;可以从以下几个方面进行&#xff1a; 系统启动的时候Spring Security做了哪些事情&#xff1f;发起一次请求后Spring Security做了哪些事情&#xff1f; 系统启动 当…

Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本

前言 Puppeteer已经听说过很多次了&#xff0c;也见过一些与之相关的文章。但是一直没怎么研究过&#xff0c;现在来简单学习一下。 简介 Puppeteer 是一个 Node 库&#xff0c;它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headles…

【离网逆变器】离网逆变器型号由一个高频DC-DC升压转换器与全桥PI控制电压源逆变器级联组成、逆变器使用带LC滤波器的SPWM调制(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

HTML5+CSS3+JS小实例:鼠标控制飞机的飞行方向

实例:鼠标控制飞机的飞行方向 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conten…

Vue项目前端代码防止被调试

项目背景 被安全测试针对了&#xff0c;总是调试我这不太安全的代码。前端代码深度混淆转成十六进制还不行&#xff0c;仍然找到加密方法&#xff0c;对后端数据进行解密。这次就修改了思路换种方法: 我承认阁下很强&#xff0c;但假如, 我是说假如打开控制台是空白页面&…

森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&#xff0c;甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

eclipse svn插件安装

1.进入eclipse的help->Eclipse Marketplace,如下图所示&#xff1a; 2.输入“svn”,再按回车&#xff0c;如下图&#xff1a; 3.这我选择的是 Subversive,点击后面的“install”按钮&#xff0c;如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…

linux离线安装make

一、下载rpm包 https://pkgs.org/search/?qmake 二、拷贝至服务器 三、安装make rpm -ivh make-3.82-24.el7.x86_64.rpm四、查看是否安装成功 make -v