• 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语句,而非实体的字段名字

  • 相关阅读:
    vc++ 最小化到托盘的详细实现
    WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)
    windows 进程间通讯方法
    C++中各种数据量类型转换
    WTL 自绘 进度条Progressbar
    C++ 读取XML文件(tinyXML库的应用)
    WTL 自定义 Button类-自绘
    设计模式课程 设计模式精讲 27-3 状态模式源码解析
    设计模式课程 设计模式精讲 27-2 状态模式coding
    设计模式课程 设计模式精讲 26-3 访问者模式源码解析
  • 原文地址:https://www.cnblogs.com/youqc/p/11097574.html
Copyright © 2020-2023  润新知