在 JPA 的 @Query
注解中有个属性 nativeQuery其默认值是false。
package org.springframework.data.jpa.repository;
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 {
String value() default "";
String countQuery() default "";
String countProjection() default "";
boolean nativeQuery() default false;
String name() default "";
String countName() default "";
}
Teacher.java
package org.zpli.springdemo.bean;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import lombok.Setter;
/**
* created at 2021/6/3 3:38 下午
*
* @author somnuszpli
*/
@Setter
@Getter
@Entity
@Table(name = "TEACHER")
public class Teacher {
@JsonDeserialize(
as = Long.class
)
@JsonSerialize(
using = ToStringSerializer.class
)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME", length = 50)
private String name;
@Column(name = "AGE")
private int age;
@Column(name = "ADDRESS")
private String address;
}
nativeQuery = true时,是可以执行原生sql语句,所谓原生sql,也就是说这段sql拷贝到数据库中,然后把参数值给一下就能运行了,比如:
@Query(value = "select * from TEACHER where AGE>=?1",nativeQuery = true)
List<Teacher> findAllByAge(Integer age);
这个时候,把 select * from TEACHER where AGE>=?1 拷贝到数据库中,并给 age 赋一个值,那么这段sql就可以运行。其中数据库表在数据库中的表名就是 TEACHER ,字段 AGE 在数据库中也是真实存在的字段名。
不指定 nativeQuery = true时,默认 nativeQuery = false。就不是原生sql,而其中的 select * from xxx 中 xxx 也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。例如:
@Query("select t from Teacher t where t.age>=?1 ")
List<Teacher> findAllByAge(Integer age);