Spring Data JPAカスタムnativeクエリー
カスタムnativeクエリー
主に2つの注釈、カスタムデータクラスタイプの定義に注意してください.データベースクエリがBigIntegerを返し、フィールドがLongタイプのフィールドである場合、Unable to locate appropriate constructor on class とエラーが発生します.問題が発生するorgにデバッグできる.hibernate.loader.custom.ConstructorResultColumnProcessor#resolveConstructorメソッドは、返される実際のタイプ を表示します.
主に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 {
...
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;
}
}