iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JpaRepository 实现简单条件查询
  • 750
分享到

JpaRepository 实现简单条件查询

2024-04-02 19:04:59 750人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录JpaRepository 简单条件查询创建持久化类定义数据访问层接口定义业务层类定义控制器类测试应用JpaRepository 查询规范1.JpaRepository支持接口规

JpaRepository 简单条件查询

JpaRepository继承自PagingAndSortingRepository接口,JpaRepository基于JPA的Repository接口,极大减少了JPA作为数据访问的代码,JpaRepository是实现Spring Data JPA技术访问数据库的关键接口。

示例:简单条件查询

创建持久化类

程序清单:/jpa/src/main/java/com/dwx/bean/User.java


package com.dwx.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer userId;
	private String userName;
	private String sex;
	private Integer age;
	public User() {}
	public User(String userName,String sex,Integer age) {
		this.userName=userName;
		this.sex=sex;
		this.age=age;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

定义数据访问层接口

程序清单:/jpa/src/main/java/com/dwx/repository/UserRepository.java


package com.dwx.repository;
import java.util.List;
 
import org.springframework.data.jpa.repository.JpaRepository;
import com.dwx.bean.User;
public interface UserRepository extends JpaRepository<User, Integer> {
	User findByUserName(String userName);
	List<User> findByUserNameAndAge(String userName,Integer age);
	List<User> findByUserNameLike(String userName);
}

定义业务层类

程序清单:/jpa/src/main/java/com/dwx/service/UserService.java


package com.dwx.service;
import java.util.List;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.dwx.bean.User;
import com.dwx.repository.UserRepository;
@Service
public class UserService {
	@Resource
	private UserRepository userRepository;
	
	@Transactional
	public void saveAll(List<User> users) {
		userRepository.saveAll(users);
	}
	
	public User getUserByUserName(String userName) {
		return userRepository.findByUserName(userName);
	}
	
	public List<User> getUserByUserNameAndAge(String userName,Integer age){
		return userRepository.findByUserNameAndAge(userName, age);
	}
	
	public List<User> getUserByUserNameLike(String userName){
		return userRepository.findByUserNameLike(userName);
	}
}

定义控制器类

程序清单:/jpa/src/main/java/com/dwx/controller/UserController.java


package com.dwx.controller;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.WEB.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.dwx.bean.User;
import com.dwx.service.UserService;
@RestController
@RequestMapping("/user")
public class UserController {
	@Resource
	private UserService userService;
	
	@RequestMapping("/save")
	public String save() {
		User user1=new User("john","男",25);
		User user2=new User("lucy","女",18);
		User user3=new User("Tom","男",16);
		List<User> users=new ArrayList<>();
		users.add(user1);
		users.add(user2);
		users.add(user3);
		userService.saveAll(users);
		return "保存成功";
	}
	
	@RequestMapping("/userName")
	public User getByUserName(String userName){
		return userService.getUserByUserName(userName);
	}
	
	@RequestMapping("/userNameAndAge")
	public List<User> getByUserNameAndAge(String userName,Integer age){
		return userService.getUserByUserNameAndAge(userName, age);
	}
	
	@RequestMapping("/userNameLike")
	public List<User> getByUserNameLike(String userName){
		return userService.getUserByUserNameLike(userName);
	}
}

测试应用

添加用户信息,在浏览器中输入以下地址:Http://localhost:8080/user/save

根据姓名和年龄查询,在浏览器中输入以下地址:http://localhost:8080/user/userNameAndAge?userName=john&age=25

根据姓名模糊查询,在浏览器中输入以下地址:http://localhost:8080/user/userNameLike?userName=jack

JpaRepository 查询规范

1.JpaRepository支持接口规范方法名查询

意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下。

KeyWord

Sample

JPQL snippet

IsNotNull

findByAgeNotNull

... where x.age not null

Like

findByNameLike

... where x.name like ?1

NotLike

findByNameNotLike

... where x.name not like ?1

StartingWith

findByNameStartingWith

... where x.name like ?1(parameter bound with appended %)

EndingWith

findByNameEndingWith

... where x.name like ?1(parameter bound with prepended %)

Containing

findByNameContaining

... where x.name like ?1(parameter bound wrapped in %)

OrderBy

findByAgeOrderByName

... where x.age = ?1 order by x.name desc

Not

findByNameNot

... where x.name <> ?1

In

findByAgeIn

... where x.age in ?1

NotIn

findByAgeNotIn

... where x.age not in ?1

True

findByActiveTrue

... where x.avtive = true

Flase

findByActiveFalse

... where x.active = false

And

findByNameAndAge

... where x.name = ?1 and x.age = ?2

Or

findByNameOrAge

... where x.name = ?1 or x.age = ?2

Between

findBtAgeBetween

... where x.age between ?1 and ?2

LessThan

findByAgeLessThan

... where x.age < ?1

GreaterThan

findByAgeGreaterThan

... where x.age > ?1

After/Before

...

...

IsNull

findByAgeIsNull

... where x.age is null

2.JpaRepository相关查询功能

a.Spring DataJPA框架在进行方法名解析时

会先把方法名多余的前缀截取掉,比如find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。

b.假如创建如下的查询

findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc。

1:先判断userDepUuid (根据POJO规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

2:从右往左截取第一个大写字母开头的字符串此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user为查询实体的一个属性;

3:接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据“Doc.user.depUuid” 的取值进行查询;否则继续按照步骤2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进行查询。

4:可能会存在一种特殊情况,比如Doc包含一个user的属性,也有一个userDep 属性,此时会存在混淆。可以明确在属性之间加上"_"以显式表达意图,比如"findByUser_DepUuid()"或者"findByUserDep_uuid()"

c.特殊的参数

还可以直接在方法的参数上加入分页或排序的参数,比如:


Page<UserModel>findByName(String name, Pageable pageable);
List<UserModel>findByName(String name, Sort sort);

d.也可以使用JPA的NamedQueries,方法如下

1:在实体类上使用@NamedQuery,示例如下:


@NamedQuery(name ="UserModel.findByAge",query = "select o from UserModel o where o.age >=?1")

2:在自己实现的DAO的Repository接口里面定义一个同名的方法,示例如下:


publicList<UserModel> findByAge(int age);

3:然后就可以使用了,Spring会先找是否有同名的NamedQuery,如果有,那么就不会按照接口定义的方法来解析。

e.还可以使用@Query来指定本地查询

只要设置nativeQuery为true,比如:


@Query(value="select* from tbl_user where name like %?1" ,nativeQuery=true)
publicList<UserModel> findByUuidOrAge(String name);

注意:当前版本的本地查询不支持翻页和动态的排序

f.使用命名化参数

使用@Param即可,比如:


@Query(value="selecto from UserModel o where o.name like %:nn")
publicList<UserModel> findByUuidOrAge(@Param("nn") String name);

g.同样支持更新类的Query语句

添加@Modifying即可,比如:


@Modifying
@Query(value="updateUserModel o set o.name=:newName where o.name like %:nn")
public intfindByUuidOrAge(@Param("nn") String name,@Param("newName")String
newName);

注意:

1:方法的返回值应该是int,表示更新语句所影响的行数

2:在调用的地方必须加事务,没有事务不能正常执行

h.创建查询的顺序

Spring Data JPA在为接口创建代理对象时,如果发现同时存在多种上述情况可用,它该优先采用哪种策略呢?

<jpa:repositories>提供了query-lookup-strategy 属性,用以指定查找的顺序。

它有如下三个取值:

1:create-if-not-found:如果方法通过@Query指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则通过解析方法名字来创建查询。这是querylookup-strategy 属性的默认值

2:create:通过解析方法名字来创建查询。即使有符合的命名查询,或者方法通过@Query指定的查询语句,都将会被忽略

3:use-declared-query:如果方法通过@Query指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异常

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: JpaRepository 实现简单条件查询

本文链接: https://www.lsjlt.com/news/158347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JpaRepository 实现简单条件查询
    目录JpaRepository 简单条件查询创建持久化类定义数据访问层接口定义业务层类定义控制器类测试应用JpaRepository 查询规范1.JpaRepository支持接口规...
    99+
    2022-11-12
  • oralce简单条件查询练习
    第1章  简单查询与条件查询 01. 使用 SQL PLUS 工具登陆,用户名用 scott 。 02. 在 emp 表中查询出所...
    99+
    2022-10-18
  • MySQL基础篇 | 简单的查询、条件查询、排序查询
    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 一:简单的查询 1. 查询一个字段 2. 查询多个字段  3...
    99+
    2023-09-01
    mysql 数据库 sql
  • ORACLE多条件统计查询的简单方法
    前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析。一开始便想到了UNION和IF语句,然后写了1000多行代码,就为了查30条数据觉得不应该。 然后就开始百度,多种条件下的统计。然...
    99+
    2022-10-18
  • mybatis plus实现条件查询
    目录一、wapper介绍二、常用的条件方法1. gt 表示 >2. le 表示 <=3. lt&nb...
    99+
    2022-11-13
  • mybatisplus如何实现条件查询
    本篇内容介绍了“mybatisplus如何实现条件查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、wapper介绍用mp也可以方便的实...
    99+
    2023-06-30
  • redis怎么实现条件查询?
    redis怎么实现条件查询?这个问题可能是我们日常工作经常见到的。通过这个问题,希望你能收获更多。今天跟随小编一起来看解决方案吧。一、导入jar包二、实现简单的条件查询创建一个User实体类public c...
    99+
    2022-10-18
  • 如何实现多条件查询
    这篇文章主要讲解了“如何实现多条件查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现多条件查询”吧! 而在对用户进行查...
    99+
    2022-10-18
  • dedecms怎么实现条件查询
    dedecms可以使用SQL查询语句来实现条件查询,操作步骤为:1、打开DedeCMS管理后台;2、导航到“数据库管理”页面;3、根据需求,编写相应的查询语句;4、点击执行按钮或相应的提交按钮来执行查询;5、查看符合查询条件的记录即可。本教...
    99+
    2023-08-03
  • SSH如何实现条件查询和分页查询
    这篇文章将为大家详细讲解有关SSH如何实现条件查询和分页查询,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、QueryHelper和PageResultQueryHel...
    99+
    2022-10-19
  • MySQL实现单表查询的简单方法
    本文主要给大家简单讲讲MySQL实现单表查询的简单方法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL实现单表查询的简单方法这篇文章可以给大家带来一...
    99+
    2022-10-18
  • MyBatis-Plus 条件查询器的实现
    目录一、常用注解1.1 @TableName1.2 @TableId1.3 @TableField1.4 @TableLogic二、条件构造器Wrapper2.1 QueryWrap...
    99+
    2022-11-13
  • layui多条件查询怎么实现
    在Layui中实现多条件查询可以通过以下步骤实现:1. 在HTML页面中创建一个表单,包含多个输入框或下拉框,用于用户输入查询条件。...
    99+
    2023-09-22
    layui
  • Layui如何实现多条件查询
    这篇文章主要介绍了Layui如何实现多条件查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近做一个档案系统,发现字段超多带分页的多条件查询(分页需要后端分页,传page给...
    99+
    2023-06-25
  • mybatis实现多条件模糊查询
    EmployeeMapper.xml SELECT id,NAME,gender,idcard,nationid FROM employee WHERE 1=1 ...
    99+
    2023-09-01
    sql 数据库 mysql
  • jQuery实现简单登录条件判断
    本文实例为大家分享了jQuery实现简单登录条件判断的具体代码,供大家参考,具体内容如下 一、效果展示 二、思路分析 1、在输入框都不为空且勾选协议的情况下改变登录按钮的状态。2、...
    99+
    2022-11-13
  • SQL中怎么实现多条件查询
    SQL中怎么实现多条件查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。第一种写法是if (@addDate is&n...
    99+
    2022-10-18
  • mysql如何实现条件查询语句
    小编给大家分享一下mysql如何实现条件查询语句,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 在mysql中,可以使用SELECT语句和WHER...
    99+
    2022-10-19
  • Linq中怎么实现多条件查询
    这篇文章将为大家详细讲解有关Linq中怎么实现多条件查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linq多条件查询(高级搜索),假如一共可以输入5个条件,但是用户根据需要可能只输2个或...
    99+
    2023-06-17
  • mysql instr条件查询的实现方法
    这篇文章主要介绍“mysql instr条件查询的实现方法”,在日常操作中,相信很多人在mysql instr条件查询的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql instr条件查询的实...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作