@Query和@Modifying这两个注解使用过程如下:
@Query("update Article set state = ?2 where id = ?1")//默认是只读事务
@Modifying//增删改的时候加。SpringDataJPA不自动提供事务了-没事务了-手动事务
void updateStateById(String id,String state);
其中 ?2 和 ?1 代表的占位符,?n 中n的顺序是从1开始的,和method 中 参数的顺序相对应。
1、@Query
这样的查询结构更加清晰。当然也可以使用命名参数。
使用命名参数 必须配合 @param 注解使用,这样的话就无需考虑 顺序问题了。
@Query("SELECT p FROM Problem p WHERE p.repaly = :replay AND p.repalytime = :replaytime")
List<Problem > testQueryAnnotationParams2(@Param("replaytime") String replaytime, @Param("repaly ") String repaly );
Like 关键字查询,
1、在占位符上添加 % ,这样method 就无需添加
2、在method 上添加 % ,这样占位符上就不需要添加了。
3、在命名参数上面添加 %
下面举一个例子,不再进行多个例子列举。
@Query("SELECT p FROM Problem p WHERE p.repaly Like %:replay OR p.repalytime Like %:replaytime")
List<Problem > testQueryAnnotationParams2(@Param("replaytime") String replaytime, @Param("repaly ") String repaly );
2、@Modifying
1、@Query注解中编写JPQL实现DELETE和UPDATE操作的时候必须加上@modifying注解。
2、JPQL不支持INSERT操作。
3、在 service 层必须添加事务注解。 @Transactional