likes
comments
collection
share

Spring Data JPA渐进式学习--@Query的使用方法

作者站长头像
站长
· 阅读数 30

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
评论
请登录