SpringData系列四 @Query注解及@Modifying注解

    @Query注解查询适用于所查询的数据没法经过关键字查询获得结果的查询。这种查询能够摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现。spa

  • 索引参数与命名参数

    一、索引参数以下所示,索引值从1开始,查询中"?X"个数须要与方法定义的参数个数相一致,而且顺序也要一致。     code

1 @Query("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2") 2     List<Person> testQueryAnnotationParams1(String lastName, String email);

    注释:上面代码中的?1,?2表示参数的占位符,须要和方法中所传递的参数顺序一致。X是从1开始。blog

 

    二、命名参数(推荐使用此方式):能够定义好参数名,赋值时使用@Param("参数名"),而不用管顺序。索引

1 // 为@Query注解传递参数的方式1:命名参数
2     @Query("SELECT p FROM Person p WHERE p.lastName = :lastName AND p.email = :email") 3     List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("lastName") String lastName);

    注释:上面代码中:lastName ,:email 表示为参数命名,方法中所传递的参数使用@Param注解标识命名参数。这种方式不用管参数的顺序。接口

 

    三、含有LIKE关键字的查询事务

      方式1:能够在占位符上添加"%",这样在查询方法中就不用添加"%"get

1 // like查询 Spring Date 容许在占位符上添加%
2     @Query("SELECT p FROM Person p WHERE p.lastName LIKE %?1% OR p.email LIKE %?2%") 3     List<Person> testQueryAnnotationLikeParam(String lastName, String email);
1 @Test 2     public void testAnnoationParams3() { 3         List<Person> persons = personRepsitory.testQueryAnnotationLikeParam("A", "A@126.com"); 4  System.out.println(persons); 5     }

 

      方式2:不在占位符上添加"%",这样就必须在查询方法的参数上添加"%"it

1     // like查询
2     @Query("SELECT p FROM Person p WHERE p.lastName LIKE ?1 OR p.email LIKE ?2") 3     List<Person> testQueryAnnotationLikeParam2(String lastName, String email);
1 @Test 2     public void testAnnoationParams4() { 3         List<Person> persons = personRepsitory.testQueryAnnotationLikeParam2("%A%", "%A@126.com%"); 4  System.out.println(persons); 5     }

 

      方式3:在命名参数上添加"%"io

// like查询 使用命名参数
    @Query("SELECT p FROM Person p WHERE p.lastName LIKE %:lastName% OR p.email LIKE %:email%") List<Person> testQueryAnnotationLikeParam3(@Param("email") String email, @Param("lastName") String lastName);

 

    四、使用原生SQL进行查询ast

   **
     * 设置nativeQuery=true 便可以使用原生的SQL进行查询 * @return
     */ @Query(value = "SELECT count(id) FROM jpa_persons", nativeQuery = true) long getTotalCount();

    注释:当设置nativeQuery=true便可以使用原生SQL进行查询

  •  @Modifying注解

    一、在@Query注解中编写JPQL实现DELETE和UPDATE操做的时候必须加上@modifying注解,以通知Spring Data 这是一个DELETE或UPDATE操做。

    二、UPDATE或者DELETE操做须要使用事务,此时须要 定义Service层,在Service层的方法上添加事务操做。

    三、注意JPQL不支持INSERT操做。  

1 @Transactional 2  @Modifying 3     @Query("UPDATE Person p SET p.email = :email WHERE p.id = :id") 4     void updatePersonEmail(@Param("id") Integer id, @Param("email") String email);