Spring Data JPA渐进式学习--@Query的使用方法
1 @Query浅尝
先举一个例子
public interface UserRepository extends JpaRepository<UserInfo,Integer> {
@Query("From UserInfo where name = :name")
UserInfo findByQuery(@Param("name") String name);
}
直接调用的结果是:
{
"id": 999,
"address": "陕西",
"name": "小明",
"age": 18
}
很明显,是可以工作的,这样的话,是不会根据方法名进行解析的,而是解析了Query里的内容,并执行sql.
2 基本用法
通过@Query的源码我们可以看到以下内容,使用注解标明了用途
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@QueryAnnotation
@Documented
public @interface Query {
//JPQL的查询语句,当nativeQuery=true的时候,是原生的sql
String value() default "";
//指定count的查询语句,当nativeQuery=true的时候,是原生的sql
String countQuery() default "";
//count所依据的字段
String countProjection() default "";
//表示value里是不是原生的sql语句
boolean nativeQuery() default false;
//query的名字,需要唯一。默认为"className.methodName"
String name() default "";
//count的query的名字,需要唯一,默认为"className.methodName.count"
String countName() default "";
}
其实,一般只有value,nativeQuery,countQuery时常能用到,其他一般都保持默认。
2.1 JPQL语法
其实JQPL的语法和sql语法类似,区别是JPQL的FROM后边是对象,sql的from后边是对象对应的表名。
2.2 @Query用法案例
2.2.1 直接使用
使用的时候,将需要的JPQL语句写入Query里边即可
@Query("select u From UserInfo u where u.name = ?1")
UserInfo findByQuery(String name);
2.2.2 LIKE查询
因为模糊查询的时候,@Query不会自动添加%,所以要主动添加
@Query("select u From UserInfo u where u.name like %?1")
UserInfo findByNameLike(String name);
2.2.3 原生sql
当需要写原生sql的时候,添加参数nativeQuery=true
即可
@Query(value = "select * From user_info u where u.name =?1",nativeQuery = true)
UserInfo findByName(String name);
2.3 排序
@Query中使用JPQL的时候,想要实现排序,PageRequest和Sort都是可以实现的。
@Query(value = "select u From UserInfo u where u.name like %?1")
List<UserInfo> findByNameList(String name,Sort sort);
2.4 分页
想要分页的话,直接用Page对象接收接口返回,参数用Pageable的实现类即可
@Query(value = "select u From UserInfo u where u.name like %?1")
Page<UserInfo> userList(String name, Pageable pageable);
2.5 @Param的用法
@Param注解可以指定方法参数的具体名称,这样就不用关系参数的顺序,也更利于代码的重构。
@Query("select u From UserInfo u where u.name = :name")
UserInfo findByNameLike(@Param("name") String name);
3 动态查询
动态查询都是利用了SQL的and(:name is null or u.name = :name)这个语法实现的。
@Query("select u From UserInfo u where (:name is null or u.name = :name) and (:age is null or u.age = :age) ")
UserInfo findByNameAndAge(@Param("name") String name,@Param("age") Integer age);
查询
@GetMapping(path = "users")
@ResponseBody
@WebLog(printResult = true)
public UserInfo getUsers(){
UserInfo byName = userRepository.findByNameAndAge("小明",null);
return byName;
}
查询结果
{
"id": 999,
"address": "陕西",
"name": "小明",
"age": 18
}
4 原生sql动态查询
原生的动态查询,根据以下写法即可
@Query(value = "select * From user_info u where (:#{#userInfo.name} is null or u.name =:#{#userInfo.name}) ",nativeQuery = true)
UserInfo findByName(@Param("name") UserInfo userInfo);
转载自:https://juejin.cn/post/7137322058991534111