Spring Data JPAカスタムnativeクエリー


カスタムnativeクエリー
主に2つの注釈、@SqlResultSetMappingおよび@NamedNativeQueryが使用され、それぞれ結果セットタイプおよびsqlの定義を表します.例は以下のとおりです.

@Entity
@SqlResultSetMapping(
        name = "TestModel",
        classes = {
                @ConstructorResult(
                        targetClass = TestModel.class,
                        columns = {
                                @ColumnResult(name = "money", type = BigDecimal.class),
                                @ColumnResult(name = "score", type = String.class)
                        }
                )
        }
)
@NamedNativeQuery(
        name = "TSchemesEntity.testFind",
        query = "select Money money,Score score from T_Schemes, T_SchemesContent where T_Schemes.ID=T_SchemesContent.SchemeID ",
        resultSetMapping = "TestModel"
)
@Table(name = "T_Schemes", schema = "dbo", catalog = "db")
public class TSchemesEntity {
    ...
  • カスタムデータクラスタイプの定義に注意してください.データベースクエリがBigIntegerを返し、フィールドがLongタイプのフィールドである場合、Unable to locate appropriate constructor on class
  • とエラーが発生します.
  • 問題が発生するorgにデバッグできる.hibernate.loader.custom.ConstructorResultColumnProcessor#resolveConstructorメソッドは、返される実際のタイプ
  • を表示します.
    
    public interface TSchemesRepository extends JpaRepository<TSchemesEntity, Long> {
    
        @Query(nativeQuery = true)
        public List<TestModel> testFind();
    }
    
    
    
    public class TestModel {
    
        private BigDecimal money;
    
        private String score;
    
        public TestModel(BigDecimal money, String score) {
    
            this.money = money;
            this.score = score;
        }
    
        public BigDecimal getMoney() {
    
            return money;
        }
    
        public void setMoney(BigDecimal money) {
    
            this.money = money;
        }
    
        public String getScore() {
    
            return score;
        }
    
        public void setScore(String score) {
    
            this.score = score;
        }
    }