您的位置:首页 > 编程语言 > Java开发

SpringData-3 @Query与@Modifying注解

2017-04-09 21:57 260 查看

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: