一、调用接口的方式

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方法
}
  1. JpaRepository<T,ID>

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



2. JpaSpecificationExecutor

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

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的前提是你已经使用注解配置好了实体类以及参数



注解的详细信息如下:

/**
* @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的四种查询方式的更多相关文章

  1. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  2. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  3. Spring Data JPA 自定义对象接收查询结果集

    Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...

  4. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  5. Spring Data JPA 的 Specifications动态查询

    主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询. ...

  6. Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...

  7. Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)

    推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...

  8. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

  9. spring data jpa实现多条件查询(分页和不分页)

    目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...

随机推荐

  1. split分割文件与数据

    split主要用途:在之前计算机发展的时候,我们必须分割文件,才能将大量数据放入多张软盘中,而今我们分割文件有了其他的目的,比如提高可读性,生成日志以及发送有大小限制的E-mail附件. 工作原理:s ...

  2. Python调试工具

    1. 日志 通过日志或者print来打印变量.必要时可以打印locals()和globals() 建议使用logging.debug()来代替print,这样到了正式环境,就可以统一删除这些日志. 2 ...

  3. Https 与 iOS 信息安全

    转载自:swift-cafe 什么是 Https 咱们从最直观的说起. 我们平时在用电脑访问网页的时候,有时候会在地址栏的左边多出一个小锁的图标,就像这样: 这是大多数主流浏览器的一个通用做法,当我们 ...

  4. 机器学习笔记(一)&#183; 感知机算法 &#183; 原理篇

    这篇学习笔记强调几何直觉,同时也注重感知机算法内部的动机.限于篇幅,这里仅仅讨论了感知机的一般情形.损失函数的引入.工作原理.关于感知机的对偶形式和核感知机,会专门写另外一篇文章.关于感知机的实现代码 ...

  5. CSPS模拟 62

    婚礼现场系列 T1 $gragh$ 为了方便把边的贡献下放到点,跑一个生成树作为划分依据. T2 $permutation$ 由于在本题中,构造的变换方法保证只能邻项交换 所以如果位置串字典序变小,权 ...

  6. 带你上手一款下载超 10 万次的 IDEA 插件

    作者 | 倪超(银时) 阿里云开发者工具产品专家 本文整理自 11 月 7 日社群分享,每月 2 场高质量分享,点击加入社群. 导读:Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效 ...

  7. Vue+element UI实现分页组件

    介绍 这是一个是基于element-UI的分页组件基础上,进行了二次封装的分页组件,在展示数据时,该分页组件采用了每显示一页数据,只请求当前页面的数据的请求策略,从而避免了一次性将数据全部请求所造成的 ...

  8. 考试T3麻将

    这题就是一个简单的暴力,但考试的时候不知道脑子在想什么,什么都没打出来,也许是我想的太多了... 这道题对于不会打麻将的人来说还是有点难理解规则的,我没说过我会打麻将,这里是题目链接. 20分思路,利 ...

  9. 『题解』洛谷P3958 奶酪

    Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...

  10. maven安装与在eclipse中配置

    需要准备 eclipse maven压缩包 : http://maven.apache.org/download.cgi 1 解压maven压缩包 2 在系统变量中新建变量MAVEN_HOME,值为 ...