详细讲解声明式的查询方法

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 (四)注解式查询方法的更多相关文章

  1. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

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

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

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

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

  4. Spring Data -Specification用法和常用查询方法(in,join,equal等)

    Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 总结 前言 ...

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

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

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

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

  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. springboot - 应用实践(1)认识springboot

    1.为什么要推出springboot springboot设计的目的是用来简化新spring应用的初始搭建以及开发过程.springboot遵循“约定优于配置”原则. 2.springboot默认的配 ...

  2. adb 打印kernel输出的log

     一. linux 内核printk机制     1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...

  3. MD5算法+盐Salt

    1.MD算法的基的概念    MD5算法是典型的消息摘要算法,其前身有MD2.MD3和MD4算法,它由MD4.MD3和MD2算法改进而来.不论是哪一种MD算法,它们都需 要获得一个随机长度的信息并产生 ...

  4. [.net core]10.请求静态文件, 自定义默认文件名

    何谓静态文件,文件系统上的文件,  css, javascript , image. html  这些都属于静态文件, .net core web app 默认是不处理文件请求的.  我们来做一个实验 ...

  5. [WPF]鼠标位置捕捉

    private void StackPanel_MouseMove(object sender, MouseEventArgs e) {     Debug.WriteLine("Move& ...

  6. element-ui使用el-tabs组件的时候浏览器直接卡死的问题

    遇到这个问题的原由是:本身自己项目的elementUI版本是2.0.11较低了,项目有个功能是自定义progress进度条颜色,无奈高版本的才有这个配置,所以就升级了elementUI,升级到了最高版 ...

  7. Jquery复习(七)之尺寸

    jQuery 尺寸 方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() outerWidth() outerHei ...

  8. 真香系列之 Golang 升级

    Golang 以前的依赖管理一直饱受诟病,社区的方案也层出不穷,比如 vendor, glide, godep 等.之前的依赖管理一直是依靠 GOPATH 或者将依赖代码下载到本地,这种方式都有劣势. ...

  9. 硬盘安装ubuntu遇到的问题

    终于把这个系统给装上了,陆陆续续弄了4,5天(崩溃...),一直一来都是用U盘来装ubuntu的,挺简单的,但是这个主机识别不了U盘不知道为什么...这个问题又是百度又是Google最终找不到原因只好 ...

  10. 查看 apache 的编译参数

    cat /home/oldboy/run/apache/build/config.nice 范例 2: [root@VM-002 ~]# cat /home/oldboy/run/apache/bui ...