JPA使用の@Queryの常用表記

3716 ワード

の準備を
エンティティ
@Data
@Table(name = "task_apply")
@Entity
public class TaskApply {
    @Id
    @GeneratedValue
    @Column(name = "apply_id")
    private Long applyId;
    
    private Integer status;
    
    private SyncType type;
    
    @Column(name = "task_message")
    private String taskMessage;
}

同期タイプ
package com.charles.enums

public enum SyncType {
    /**
     *     
     */
    MANUAL("M", "    "),
    /**
     *     
     */
    SCHEDULED("S", "    ");

    private final String value;
    private final String text;

    SyncType(String value, String text) {
        this.value = value;
        this.text = text;
    }

    public String text() {
        return text;
    }

    public String getValue() {
        return value;
    }

    public static SyncType fromValue(String type) {
        for (SyncType value : SyncType.values()) {
            if (value.equals(type)) {
                return value;
            }
        }
        return null;
    }
}

列挙された変換器
import javax.persistence.AttributeConverter;

public class SyncTypeConverter implements AttributeConverter {

    @Override
    public String convertToDatabaseColumn(SyncType e) {
        if (e == null) {
            return null;
        }
        return e.getValue();
    }

    @Override
    public SyncType convertToEntityAttribute(String value) {
        if (value == null) {
            return null;
        }
        return SyncType.fromValue(value);
    }
}

変更
コロンパラメータの使用
@Modifying
@Query("update TaskApply set status = :status where applyId = :applyId")
void updateStatusByApplyId(@Param("applyId") Long applyId, @Param("status") Integer status);

疑問符を使用して参照
@Modifying
@Query("update TaskApply set status = ?2 where applyId = ?1")
void updateStatusByApplyId(Long applyId, Integer status);

検索
指定された列の1番目の書き方に戻る
package com.charles.vo;

@Data
public class TaskMessageVO {
    private Long applyId;
    private String taskMessage;
}

@Query("select new com.charles.vo.TaskMessageVO(applyId, taskMessage) from TaskApply where applyId in (:applyIds)")
List findTaskMessages(@Param("applyIds") List applyIds);

指定された列の2番目の書き方を返します
@Query(nativeQuery = true, value = 
"SELECT id as applyId, task_message as taskMessage FROM task_apply WHERE apply_id IN (:applyIds)")
List findTaskMessages(@Param("applyIds") List applyIds);

この表記はnativeQueryであり,返された結果は各Objectに1つの配列が返され,配列の下付き文字0はapplyId,下付き文字1はtaskMessageが返される.
クエリーの列
@Query("select distinct status from TaskApply where applyId in (:applyIds)")
List findDistinctStatus(@Param("applyIds") List applyIds);

クエリーの条件は定数です
@Query("select applyId from TaskApply where type <> com.charles.enums.SyncType.MANUAL")
List findNotManualSyncApplyIds();

リファレンス
  • spel-support-in-spring-data-jpa-query-definitions
  • Spring Data JPA @Query
  • Spring JPA selecting specific columns
  • spring-data-jpa-query-with-parameter-properties
  • Spring @Query annotation with enum parameter
  • Can I use enum parameter into JpaRepository nativeQuery?
  • Spring Expression Language (SpEL)
  • Using Literals in JPQL
  • Persisting Enums in JPA