软件编程
位置:首页>> 软件编程>> java编程>> Spring Data Jpa的四种查询方式详解

Spring Data Jpa的四种查询方式详解

作者:SongAlone  发布时间:2021-10-10 10:35:26 

标签:Spring,Data,Jpa,查询

这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、调用接口的方式

1.基本介绍

通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口


public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>

使用这几种方法的前提是你定义的实体类必须标注上相应的注解


@Entity //标注这是一个实体类
@Table(name = "tbl_user") //建立实体类与表的映射关系
public class User {

@Id //声明此属性为主键
 @GeneratedValue(strategy = GenerationType.IDENTITY) //主键生成策略,自增
 @Column(name = "user_id")//指定属性对应数据库表的列名
 private Integer userId;

@Column(name = "user_name")
 private String userName;

@Column(name = "user_address")
 private String userAddress;

@Column(name = "user_salary")
 private Double userSalary;

//...getter setter toString方法
}

JpaRepository<T,ID>

第一个接口里面定义了一些简单的CRUD方法,泛型T是你定义的实体类的类型,泛型ID是你的实体类里主键的类型

Spring Data Jpa的四种查询方式详解

JpaSpecificationExecutor

这个接口可以帮助我们完成一些复杂查询,泛型T是你定义的实体类的类型

Spring Data Jpa的四种查询方式详解

2.使用方法

只需要编写一个自己的接口继承上述两个接口并填好泛型即可调用


//测试类,调用接口的findAll方法
@Test
public void testFindAll(){
 List<User> users = userDao.findAll();
 for (User user : users) {
   System.out.println(user);
 }
}

3.注意事项

JpaRepository接口里有findOne()和getOne()方法,从字面意思上来看,两种方法都是查询一个,的确如此,但它们两个本质上却有一定的差别

findOne()

底层调用了find()方法,当我们调用这个方法的时候直接为我们查出结果

getOne()

底层调用了getReference()方法,是一种懒加载的模式,使用 * 的方式为我们创建一个 * 对象,当我们调用查询结果时才会发送sql语句,查询出我们需要的结果

二、jpql查询

1.基本介绍

jpql即 Jpa Query Language

jpql语法和sql其实大同小异,jpql是针对实体类进行的操作,sql是直接对数据库表的操作,所以jpql里只是将sql里数据库表名、列名等信息替换为实体类属性而已

例如

sql语句的查询:select * from tbl_user where user_name = ?

jpql语句的查询:from User where userName = ?

2.使用方法

自定义的方法,这里使用@Query注解,value是jpql语句,你可能注意到了,每个问号后面都带了一个数字,这个数字其实就表示这个属性对应方法内形参的位置,这样我们就可以不按照属性的顺序进行赋值了。


/**
* 根据用户id和name查询
* @return 用户对象
*/
@Query(value = "from User where userId = ?2 and userName = ?1")
User findUserByIdAndName(String name, int id);

测试代码


@Test
public void testJpql1(){
 User user = userDao.findUserByIdAndName("张三", 1);
 System.out.println(user);
}

3.注意事项

想要使用jpql的前提是你已经使用注解配置好了实体类以及参数

Spring Data Jpa的四种查询方式详解

注解的详细信息如下:


/**
* @Entity
*  作用:指定当前类是实体类。
* @Table
*  作用:指定实体类和表之间的对应关系。
*  属性:
*  name:指定数据库表的名称
* @Id
*  作用:指定当前字段是主键。
* @GeneratedValue
*  作用:指定主键的生成方式。。
*  属性:
*  strategy :指定主键生成策略。
*   GenerationType.IDENTITY:自增,底层数据库必须支持自增(mysql)
*   GenerationType.SEQUENCE:序列,底层数据库必须支持序列(oracle)
*   GenerationType.TABLE:jpa提供的一种策略,通过生成一张表的方式完成主键自增,这张表存储了下一次添加的主键的值
*   GenerationType.AUTO:由程序自动选择一种策略
*
* @Column
*  作用:指定实体类属性和数据库表之间的对应关系
*  属性:
*   name:指定数据库表的列名称。
*   unique:是否唯一
*   nullable:是否可以为空
*   inserttable:是否可以插入
*   updateable:是否可以更新
*   columnDefinition: 定义建表时创建此列的DDL
*   secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
*/

三、sql查询

1.基本介绍

使用sql语句查询

2.使用方法

自定义的方法,与jpql不同的是,这种方法需要加上nativeQuery=true来声明这是一个本地查询(sql查询)


/**
* 使用sql进行条件查询
*/
@Query(value = "select * from tbl_user where user_name like ?",nativeQuery = true)
List<User> sqlFindByName(String name);

测试方法


@Test
public void testSql2(){
 List<User> users = userDao.sqlFindByName("%张%");
 for (User user : users) {
   System.out.println(user);
 }
}

四、方法命名规则查询

1.基本介绍

顾名思义,这种方法就是使用Spring Data JPA规定的方法名称进行查询,这种方式不需要我们写jpql或者sql,Spring Data JPA会解析方法名帮我们自动创建查询

2.使用方法

自定义方法


/**
* 根据用户名模糊查询和id匹配查询
* @param name
* @param id
* @return
*/
List<User> findUserByUserNameLikeAndUserId(String name, int id);

测试


@Test
public void TestName1(){
 List<User> users = userDao.findUserByUserNameLikeAndUserAddress("%张%", "北京");
 for (User user : users) {
   System.out.println(user);
 }
}

3.命名规则

按照Spring Data JPA 定义的规则,查询方法以findBy开头,删除方法以deleteBy...... 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

如果你使用的编译器是idea,当你编写的时候idea也会给出提示。

Spring Data Jpa的四种查询方式详解

来源:https://www.cnblogs.com/songjilong/p/11895497.html

0
投稿

猜你喜欢

  • 1、LongAdder由来LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操
  • 前言gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在
  • 本文实例为大家分享了unity shader实现光照效果的具体代码,供大家参考,具体内容如下效果图:shader被附给了球。灯光需要在属性面
  • 基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。1. 分组有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下
  • 十进制转二进制正整数转二进制除2取余,逆序排列,高位补零。示例:十进制255 = 二进制1111 1111计算过程:255/2=127===
  • 前提最近我的的朋友浏览一些网站,看到好看的图片,问我有没有办法不用手动一张一张保存图片!我说用Jsoup丫!测试网站打开开发者模式(F12)
  • Quartz简介Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的
  • 1、什么是Java反射机制?在程序运行中动态地获取类的相关属性,同时调用对象的方法和获取属性,这种机制被称之为Java反射机制下面给出一个反
  • 本文实例为大家分享了Unity UI实现拖拽旋转的具体代码,供大家参考,具体内容如下跟随鼠标旋转第一种效果是跟随鼠标旋转,原理是计算下鼠标位
  • 最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,
  • 本文实例讲述了java实现日期拆分的方法。分享给大家供大家参考。具体如下:如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到:
  • 什么是耦合性耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、
  • Lambda 表达式Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性
  • 一.前言RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期。消息如果在队列中一直没有被消费并且存在时间超过了TTL
  • 用Stream解决两层List属性求和假设一个人有很多个银行账户,每个银行账户中存有不同金额的存款,那么我们如何用Stream求一组人的所有
  • idea中ssm框架的编码问题介绍在idea中编码问题分为几个部分:1 tomcat服务器编码2 页面编码3 控制台编码4 操作系统编码在实
  • 1、mybatis-plus @DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.data
  • 本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个
  • 1.Shito简介1.1 什么是shiroApache Shiro是一个java安全(权限)框架Shiro可以非常容易的开发出足够好的应用,
  • Eclipse提供了一个可扩展插件的开发系统。这就使得Eclipse在运行系统之上可以实现各种功能。这些插件也不同于其他的应用(插件的功能是
手机版 软件编程 asp之家 www.aspxhome.com