Spring Data Jpa (四)注解式查询方法
详细讲解声明式的查询方法
1 @Query详解
使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效。一般只需要关心@Query里面的value和nativeQuery的值。使用声明式JPQL查询有一个好处,就是启动的时候就知道语法正确与否。
声明一个注解在Repository的查询方法上。

Like查询,注意firstname不会自动加上%关键字的
直接用原始SQL。

nativeQuery不支持直接Sort的参数查询
错误方式:

正确方式:

2.@Query排序
@Query在JPQL下想实现排序,直接用PageRequest或者直接用Sort参数都可以。
在排序实例中实际使用的属性需要与实体模型里面的字段相匹配,这意味着它们需要解析为查询中使用的属性或别名。这是一个state_field_path_expression JPQL定义,并且Sort的对象支持一些特定的函数。

3.@Query分页
直接用Page对象接收接口,参数直接用Pageable的实现类即可。

2.@Param用法
默认情况下,参数是通过顺序绑定在查询语句上的。这使得查询方法对参数位置的重构容易出错。为了解决这个问题,你可以使用@Param注解指定方法参数的具体名称,通过绑定的参数名字做查询条件。
根据参数进行查询。

3.SpEL表达式的支持
在Spring Data JPA 1.4以后,支持在@Query中使用SpEL表达式(简介)来接收变量。
SpEL支持的变量如表4-1所示

在以下的例子中,我们在查询语句中插入表达式:

这个SpEL的支持比较适合自定义的Repository,如果想写一个通用的Repository接口,那么可以用这个表达式来处理:

4. @Modifying修改查询
可以通过在@Modifying注解实现只需要参数绑定的update查询执行:

简单地针对某些特定属性的更新也可以直接用基类里面提供的通用save。还有第三种方法,就是自定义Repository,使用EntityManager来进行更新操作。用法如下:

5 @QueryHints
有很多数据库支持Hint Query的语法,不过这种查询支持比较老旧,感觉应该会慢慢被淘汰,工作中很少有人使用。Spring Data JPA还是做了很好的支持,它只支持一些固定的HintValue值,用来优化Query的作用。有两个注解需要了解和知道一下@QueryHints,value等于多个@QueryHint。
用法如下:

6 @Procedure储存过程的查询方法
我们通过@Procedure来介绍一下JPA对储存过程的支持
(1)@Procedure源码如下:

(2)首先创建一个储存过程名字plus1inout,有两个参数、两个结果。

(3)使用@NamedStoredProcedureQueries注释来调用存储过程。这个必须定义在一个实体上面。

关键要点:
存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
procedureName是存储过程的名字。
name是JPA中存储过程的名字。
使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数。
(4)直接通过自定义过的Repository完成储存过程的调用。

关键要点:
@Procedure的procedureName参数必须匹配
@NamedStoredProcedureQuery的procedureName。
@Procedure的name参数必须匹配@NamedStoredProcedureQuery的name。
@Param必须匹配@StoredProcedureParameter注释的name参数。
返回类型必须匹配:in_only_test存储过程返回是void,in_and_out_test存储过程必须返回String
7 @NamedQueries预定义查询
在@Entity下增加@NamedQuery定义

需要注意,query里面的值也是JPQL。查询参数也要和实体对应起来。因为实际场景中这种破坏Entity的侵入式很不美,也不方便,所以这种方式容易遗忘,工作中也很少推荐。
与之相对应的还有@NamedNativeQuery。用法一样,唯一不一样的是,query里面放置的是原生SQL语句,而非实体的字段名字
Spring Data Jpa (四)注解式查询方法的更多相关文章
- 【Spring Data 系列学习】Spring Data JPA @Query 注解查询
[Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...
- Spring Data JPA中的动态查询 时间日期
功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...
- spring data jpa使用原生sql查询
spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...
- Spring Data -Specification用法和常用查询方法(in,join,equal等)
Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 总结 前言 ...
- Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...
- Spring Data JPA 自定义对象接收查询结果集
Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...
- Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)
推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...
- spring data jpa 利用@Query进行查询
参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...
- spring data jpa实现多条件查询(分页和不分页)
目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...
随机推荐
- MySql MediumBlob——MySql的Bolb四种类型
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据.BLOB类型实际是个类型系列(TinyBlob.Blob.MediumBlob.LongBlob),除 ...
- NPM和webpack的关系(转载)
NPM和webpack的关系(转载):https://blog.csdn.net/cwh0908/article/details/90769823 NPM和webpack的关系(转载) 入门前端的坑也 ...
- Luogu P2915 [USACO08NOV]奶牛混合起来
题外话: 是非常颓废的博主 写题解也不在于能不能通过啦,主要是缓解颓废 首先看到这个题,肯定是可以暴力搜索的: 不得不说这道题还是很善良的,一波大暴力dfs,居然有70pts: #include< ...
- Luogu P2612 [ZJOI2012]波浪
题目 我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值. 在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献.如果\(i\)的某一边是一个比\ ...
- 利用pcl数据结构,实现RegionGrowing的复现
这篇博客是pcl中区域增长的算法进行简介以实现重写,并添加了一些判断条件. 起初原因是在使用pcl封装的regionGrowing时,效果不太好. 于是想自己重新写一下,通过改变其中种子点的生成策略和 ...
- Vue源码解读-构造函数
src/core/instance/index.js此文件主要实现了Vue初始化 // 引入模块 import { initMixin } from './init' import { stateMi ...
- [转载]如何通过ssh进行上传/下载
[转载]如何通过ssh进行上传/下载 学校给配了服务器的用户账号,但是怎么向服务器中上传以及下载文件呢?Windows下可以使用Xftp和Xshell,但是Linux下能不能用命令行解决呢? 什么是S ...
- 097、如何实现Service伸缩?(Swarm04)
参考https://www.cnblogs.com/CloudMan6/p/7885667.html 上一节部署了只有一个副本的Service,不过对于web服务,我们通常会运行多个实例,这样可以 ...
- mysql数据库之存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该 ...
- LVS实现负载均衡原理及安装配置 负载均衡
LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...