SpringData-3 @Query与@Modifying注解

1. @Query注解

/**
 * 在Repository子接口中声明方法规范: 
 * 1. 不是随便声明的,而需要符合一定的规范 
 * 2. 查询方法以find | read | get开头 
 * 3. 涉及条件查询时,条件的属性用条件关键字连接 
 * 4. 要注意的是:条件属性首字母需要大写 
 * 5. 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性 
 * 若需要使用级联属性,则属性之间使用_强制进行连接
 */
public interface PersonRepository extends Repository<Person, Integer> {

    /**
     * 问题:查询ID值最大的Person时,使用命名查询无法实现,需要借助于@Query注解来实现
     * 使用@Query注解可以自定义JPQL语句以实现更为灵活的查询
     */
    @Query("SELECT p FROM Person p WHERE p.id = (SELECT max(p2.id) FROM Person p2)")
    Person getMaxIdPerson();

    // 参数传递方式1:使用占位符的方式
    @Query("SELECT p FROM Person p WHERE p.name = ?1 AND p.email = ?2")
    List<Person> testQueryAnnotationParams1(String name, String email);

    // 参数传递方式2:使用命名参数的方式
    @Query("SELECT p FROM Person p WHERE p.name = :name AND p.email = :email")
    List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("name") String name);

    // 关于LIKE关键字:SpringData允许在占位符或命名参数上添加%%
    @Query("SELECT p FROM Person p WHERE p.name LIKE %?1% OR p.email LIKE %?2%")
    List<Person> testQueryAnnotationLikeParams1(String name, String email);
    @Query("SELECT p FROM Person p WHERE p.name LIKE %:name% AND p.email LIKE %:email%")
    List<Person> testQueryAnnotationLikeParams2(@Param("email") String email, @Param("name") String name);

    // 关于本地SQL查询:设置nativeQuery=true即可使用原生的SQL进行查询
    @Query(value="SELECT count(id) FROM SPIRINGDATA_PERSONS", nativeQuery=true)
    long getTotalCount();

}

2. @Modifying注解

/**
 * 在Repository子接口中声明方法规范: 
 * 1. 不是随便声明的,而需要符合一定的规范 
 * 2. 查询方法以find | read | get开头 
 * 3. 涉及条件查询时,条件的属性用条件关键字连接 
 * 4. 要注意的是:条件属性首字母需要大写 
 * 5. 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性 
 * 若需要使用级联属性,则属性之间使用_强制进行连接
 */
public interface PersonRepository extends Repository<Person, Integer> {

    /**
     * 可以通过自定义的JPQL完成UPDATE和DELETE操作,注意JPQL不支持INSERT操作
     * 
     * 在@Query注解中编写JPQL语句,但必须使用@Modifying注解来通知SpringData这是UPDATE或DELETE操作
     * 
     * 注意:
     * 1. 方法的返回值应该为int,表示更新语句所影响的行数
     * 2. UPDATE或DELETE操作必须使用事务,此时需定义Service层,并在其方法上添加@Transactional注解
     * 
     * 默认情况下,SpringData每个方法上均有事务,但其是只读事务,不能完成修改操作
     * 
     * @param id
     * @param email
     */
    @Transactional
    @Modifying
    @Query("UPDATE Person p SET p.email = :email WHERE p.id = :id")
    void updatePersonEmail(@Param("id") Integer id, @Param("email") String email);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值