Spring Data JPA查询操作2
注解查询时我们在查询操作中很少用到查询操作,因为Spring Data JPA基本自带的已经帮我们完成了很多复杂的查询,但是在开发中又会遇到各种意料之外的操作,所以这里介绍注解操作,扩展性非常强大(更加支持原生的SQL语法)。
@Query注解
@Query源码及解释
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.data.annotation.QueryAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@QueryAnnotation
@Documented
public @interface Query {
/*
指定JPQL的查询语句。
当nativeQuery=true时,此处的value可以替换成原生sql
*/
String value() default "";
/*
指定count的JPQL语句,如果不指定将根据query自动生成
*/
String countQuery() default "";
/*
根据哪个字段来count,一般默认即可
*/
String countProjection() default "";
/*
默认为false,表示value里面是不是原生的sql语句
*/
boolean nativeQuery() default false;
/*
可以指定一个query的名称,必须是唯一的。
如果不指定,默认的生成规则是:{$domainClass}.{$queryMethodName}
*/
String name() default "";
/*
可以指定一个count的query名字,必须是唯一的
如果不指定,默认的生成规则是:{$domainClass}.{$queryMethodName}.count
*/
String countName() default "";
}
@Query用法
使用命名查询方法为实体声明查询是一种有效的方法,对于少量查询很有效。一般只需要关心@Query里面的value和nativeQuery的值。使用声明式JPQL查询有一个好处,就是启动的时候可以知道语法正确与否。
示例1:声明一个注解在Repository的查询方法上
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
/**
* TODO
*
* @author: Yizq
* @data: 2020/8/23 4:40 下午
*/
public interface UserRepository extends JpaRepository<User,Long> {
@Query("select u from User u where u.email = ?1")
User findByEmail(String email);
}
示例2:Like查询,注意firstName不会自动加上%关键字的
public interface UserRepository extends JpaRepository<User,Long> {
@Query("