SpringData工程 @Query注解及@Modifying注解

本文详细介绍了Spring Data JPA中@Query注解的使用方法,包括索引参数、命名参数、LIKE关键字查询及原生SQL查询等场景,并讲解了@Modifying注解在DELETE和UPDATE操作中的应用。

转载自:https://www.cnblogs.com/zhaobingqing/p/6864223.html

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

  • 索引参数与命名参数

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

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开始。

 

    2、命名参数(推荐使用此方式):可以定义好参数名,赋值时使用@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注解标识命名参数。这种方式不用管参数的顺序。

 

    3、含有LIKE关键字的查询

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

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:不在占位符上添加"%",这样就必须在查询方法的参数上添加"%"

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:在命名参数上添加"%"

// 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);

 

    4、使用原生SQL进行查询

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

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

  •  @Modifying注解

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

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

    3、注意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);
<think>好的,我需要回答用户关于Spring Data JPA中@Query注解支持的所有属性的问题。首先,我应该回忆一下相关的知识,或者查找官方文档来确认属性列表。记得用户提到引用[1]和引用[2],可能需要结合这些内容。 首先,@Query注解主要用于自定义JPQL或原生SQL查询。它的常见属性包括value、nativeQuery、countQuery、name等。用户想了解所有支持的属性,我需要详细列出每个属性的作用及其用法示例。 接下来,我需要确保每个属性的描述准确,并且给出对应的例子,比如设置nativeQuery为true时使用SQL语句。此外,countQuery用于分页查询时自定义计数查询,这也是重要的点。 还要注意是否有其他属性,比如在Spring Data JPA的更新版本中是否有新增的属性。例如,是否有与锁定模式相关的属性,或者flushAutomatically等。需要确认这些信息是否正确,避免遗漏或错误。 然后,结合用户提供的引用内容,引用[1]提到了@Query的基本使用和优先级,引用[2]提到了处理空值的方法。可能需要将这些信息整合到回答中,比如在解释属性时提到如何处理空值的情况。 最后,按照用户的格式要求,使用中文回答,结构清晰,分点列出属性,并给出示例代码。同时,生成相关问题,确保问题与主题相关,帮助用户深入理解。</think>### Spring Data JPA @Query 注解支持的属性列表 Spring Data JPA 的 `@Query` 注解提供了多个属性,用于灵活定义查询逻辑。以下是支持的主要属性及其作用: 1. **value** - **作用**:定义 JPQL 或原生 SQL 查询语句。 - **示例**: ```java @Query("SELECT u FROM User u WHERE u.age > :age") List<User> findByAgeGreaterThan(@Param("age") int age); ``` 2. **nativeQuery** - **作用**:标识是否为原生 SQL 查询(默认为 `false`,即使用 JPQL)。 - **示例**: ```java @Query(value = "SELECT * FROM users WHERE status = 1", nativeQuery = true) List<User> findActiveUsers(); ``` 3. **countQuery** - **作用**:为分页查询(`Pageable`)提供自定义的计数查询(仅在 `nativeQuery = true` 时有效)。 - **示例**: ```java @Query( value = "SELECT * FROM users WHERE department = :dept", countQuery = "SELECT COUNT(*) FROM users WHERE department = :dept", nativeQuery = true ) Page<User> findByDepartment(@Param("dept") String department, Pageable pageable); ``` 4. **name** - **作用**:关联预定义的命名查询(需配合 `@NamedQuery` 使用),优先级低于直接通过 `value` 定义的查询[^1]。 - **示例**: ```java @Query(name = "User.findByEmail") // 引用@NamedQuery定义的查询 List<User> findByEmail(String email); ``` 5. **countProjection** - **作用**(已弃用):早期版本中用于自定义计数查询的投影字段,现更推荐使用 `countQuery` 属性。 --- ### 其他注意事项 - **空值处理**:在动态查询中,若参数可能为 `null`,需结合 `COALESCE` 或 `IS NULL` 条件处理,例如: ```java @Query("SELECT u FROM User u WHERE (:name IS NULL OR u.name = :name)") List<User> findByName(@Param("name") String name); ``` 这种方式可避免因参数为空导致查询语法错误[^2]。 - **修改查询**:若 `@Query` 用于更新/删除操作,需额外添加 `@Modifying` 注解: ```java @Modifying @Query("UPDATE User u SET u.status = :status WHERE u.id = :id") int updateUserStatus(@Param("id") Long id, @Param("status") String status); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值