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);