JPAではnativeQuery = true

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

おすすめ

転載: blog.csdn.net/ToBeMaybe_/article/details/117533520