jpa学习5--spring data jpa 中的JpaRepository 使用 @Query 注解

来源:互联网 发布:网络优化公司智搜宝 编辑:程序博客网 时间:2024/06/09 15:07
jpa学习5--spring data jpa 中的JpaRepository 使用 @Query 注解
1.使用@Query自定义查询,
•这种查询可以声明在 Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Springdata 的特有实现。
如:
//WHERE lastName LIKE ?% AND id < ?List<Person> getByLastNameStartingWithAndIdLessThan(String lastName, Integer id);
调用:
List<Person> persons = personRepsotory.getByLastNameStartingWithAndIdLessThan("X", 10);System.out.println(persons);
例子:
//WHERE lastName LIKE %? AND id < ?List<Person> getByLastNameEndingWithAndIdLessThan(String lastName, Integer id);//WHERE email IN (?, ?, ?) OR birth < ?List<Person> getByEmailInAndBirthLessThan(List<String> emails, Date birth);//WHERE a.id > ?List<Person> getByAddress_IdGreaterThan(Integer id);
//查询 id 值最大的那个 Person//使用 @Query 注解可以自定义 JPQL 语句以实现更灵活的查询@Query("SELECT p FROM Person p WHERE p.id = (SELECT max(p2.id) FROM Person p2)")Person getMaxIdPerson();
2.带参数查询:
2.1.使用占位符.  from后的Person是实体类名而并非表名!
//为 @Query 注解传递参数的方式1: 使用占位符. @Query("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2")List<Person> testQueryAnnotationParams1(String lastName, String email);
2.2.命名参数的方式. from后的Person是实体类名而并非表名!
//为 @Query 注解传递参数的方式1: 命名参数的方式. @Query("SELECT p FROM Person p WHERE p.lastName = :lastName AND p.email = :email")List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("lastName") String lastName);
3.like查询中的%%
//SpringData 允许在占位符上添加 %%. @Query("SELECT p FROM Person p WHERE p.lastName LIKE %?1% OR p.email LIKE %?2%")List<Person> testQueryAnnotationLikeParam(String lastName, String email);//SpringData 允许在占位符上添加 %%. @Query("SELECT p FROM Person p WHERE p.lastName LIKE %:lastName% OR p.email LIKE %:email%")List<Person> testQueryAnnotationLikeParam2(@Param("email") String email, @Param("lastName") String lastName);
4.修改,删除注意事项:
//可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作. 注意: JPQL 不支持使用 INSERT//在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作//UPDATE 或 DELETE 操作需要使用事务, 此时需要定义 Service 层. 在 Service 层的方法上添加事务操作. //默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作!@Modifying@Query("UPDATE Person p SET p.email = :email WHERE id = :id")void updatePersonEmail(@Param("id") Integer id, @Param("email") String email);






0 0
原创粉丝点击