首页 > 其他分享 >SpringDataJpa的四种查询方式详解

SpringDataJpa的四种查询方式详解

时间:2023-01-12 09:15:58浏览次数:68  
标签:实体类 SpringDataJpa name 查询 详解 user jpql 方法 四种

SpringDataJpa的四种查询方式详解
原文连接:https://www.php1.cn/detail/SpringDataJpa_De_c944e232.html
一、调用接口的方式 (JpaRepository 第一个接口里面定义了一些简单的CRUD方法)
二、jpql查询
三、sql查询
四、方法命名规则查询

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

一、调用接口的方式

1.基本介绍

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

?
1public interface UserDao extends JpaRepository<user, integer="">, JpaSpecificationExecutor<user></user></user,>

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

?
1234567891011121314151617181920@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是你的实体类里主键的类型

JpaSpecificationExecutor

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

2.使用方法

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

?
12345678//测试类,调用接口的findAll方法@Testpublic void testFindAll(){  List<user> users = userDao.findAll();  for (User user : users) {    System.out.println(user);  }}</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 = &#63;

jpql语句的查询:from User where userName = &#63;

2.使用方法

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

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

测试代码

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

3.注意事项

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


注解的详细信息如下:

?
1234567891011121314151617181920212223242526272829/** * @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查询)

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

测试方法

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

四、方法命名规则查询

1.基本介绍

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

2.使用方法

自定义方法

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

测试

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

3.命名规则

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


标签:实体类,SpringDataJpa,name,查询,详解,user,jpql,方法,四种
From: https://www.cnblogs.com/sunny3158/p/17045440.html

相关文章

  • 详解CSS3:overflow属性
    1.Overflowoverflow为溢出(容器),当内容超出容器时只需添加overflow属性值为hidden,就可以把超出容器的部分隐藏起来;如果内容超出容器却又不想其隐藏时可以将其属性值设置为......
  • linux TCP连接的状态详解以及故障排查
    TCP连接的状态详解以及故障排查  一、TCP网络常用命令了解TCP之前,先了解几个命令:linux查看tcp的状态命令:1)、netstat-nat查看TCP各个状态的数量2)、lso......
  • 棋盘放麦子 --------- 大整数(BigInteger详解)
    BigInteger类用java.math包中的BigInteger类的对象,可以使用构造方法publicBigInteger(Stringval)构造一个十进制的BigInteger对象。该构造方法可以发生NumberFormat......
  • Linux - 环境变量,安装软件的四种方法 检索文件中指定内容快速查找数据信息
    目录Linux三----etc目录下重要的数据文件fstab挂载信息表rc.local系统命令操作信息开机自动备份inittabprofile重点:环境变量bashrc设置别名motd登录系统展示的提示......
  • 爱的魔力转圈圈-流水灯电路原理详解-PCB系列教程4-1
    作为第二个案例,流水灯电路,比贴片元件焊接练习板稍微复杂一点。它的主要功能是:通过拨码开关来配置哪个灯亮,电路可以自动或手动产生周期脉冲,调整灯“流水”的速度。它的效果如......
  • K8s创建pod yaml文件详解
    apiVersion:v1#指定api版本,此值必须在kubectlapiversion中kind:Pod#指定创建资源的角色/类型metadata:#资源的元数据/属性name:web04-pod#资源的名字,......
  • RocketMQ基础详解
    RocketMQRocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。主要功能是异步解耦和流量削峰。常见的......
  • 图文详解海明校验码,通俗易懂,软考.软件设计师考试必看
    海明校验码海明校验码的准则:1.校验码必须放在2的幂次上(2n),n为0,1,2,3,....2.满足k+r+1<=2r,k为信息位的长度,r为校验码长度例:求信息1011的海明码。已知:k为4,则......
  • 平衡树详解
    平衡树是一种二叉查找树,其平衡性使得树的深度在\(\logn\)以内,增加、删除等操作可以做到\(O(\logn)\).平衡树的实现有多种,本文主要介绍\(AVL\)、\(Treap\)、\(FHQ\Tr......
  • SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
    目录问题原因复现附:报错日志问题报错日志:详见文章结尾附:报错日志程序ORM框架使用的SpringDataJPA,程序中未配置@Version或者@OptimisticLocking注解,但是报了一个乐观......