虽然官方的API中给我们提供了很多关键字的查询,但是还是不够灵活,因为我们在项目中,会遇见奇葩的业务,我们需要用SpringData中的一个@Query注解。
使用@Query自定义查询
- 这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。
-
@Query("SELECT p FROM PERSON p where p.id = ?1") Person testGetByPersonId(Integer id);
索引参数与命名参数
- 索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致
-
命名参数(推荐使用这种方式):可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。
-
@Query("SELECT p FROM PERSON p where p.lastName = :lastName AND p.email=:email") Person findByLastNameAndEmial(@Param("lastName") String lastName ,@Param("email") String email);
-
如果是 @Query 中有 LIKE 关键字,后面的参数需要前面或者后面加 %,这样在传递参数值的时候就可以不加 %: @Query("select o from UserModel o where o.name like ?1%") public List<UserModel> findByUuidOrAge(String name); @Query("select o from UserModel o where o.name like %?1") public List<UserModel> findByUuidOrAge(String name); @Query("select o from UserModel o where o.name like %?1%") public List<UserModel> findByUuidOrAge(String name);
用@Query来指定本地查询
-
还可以使用@Query来指定本地查询,只要设置nativeQuery为true,比如: @Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true) public List<UserModel> findByUuidOrAge(String name);
直接上代码:
package com.fxr.springdata; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface PersonRepsotory extends JpaRepository<Person,Integer>{ //根据lastName来获取对应的Person Person getByLastName(String lastName); //我们来试着写一个查询laskName like 'sun' and id < ?的方法 List<Person> getByLastNameStartingWithAndIdLessThan(String lastName,Integer id); //WHERE lastName LIKE %? AND id > ? List<Person> getByLastNameEndingWithAndIdGreaterThan(String lastName,Integer id); @Query("SELECT p FROM Person p where p.id = ?1") Person testGetByPersonId(Integer id); @Query("SELECT p FROM Person p where p.lastName = :lastName AND p.email=:email") Person findByLastNameAndEmial(@Param("lastName") String lastName ,@Param("email") String email); }
好了,自定义查询我们就结束了。是不是感觉SpringData很简单。