[SPRING] Projection을 사용한 Spring JPA 네이티브 쿼리는 "ConverterNotFoundException"
SPRINGProjection을 사용한 Spring JPA 네이티브 쿼리는 "ConverterNotFoundException"
Spring JPA를 사용하고 있으며 네이티브 쿼리가 필요합니다. 이 쿼리를 사용하면 테이블에서 두 개의 필드 만 가져와야하므로 Projections를 사용하려고합니다. 그것은 작동하지 않습니다, 이것은 내가 받고있는 오류입니다 :
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.example.IdsOnly]
나는 링크 된 페이지의 지시를 정확히 따르려고했는데, 내 쿼리를 비 원어로 만들려고 노력했다. (실제로 투영법을 사용하면 네이티브 일 필요가 있는가?) 그러나 나는 항상 그 오류를 얻는다. 인터페이스를 사용하면 작동하지만 결과는 프록시이므로 json으로 바꿀 수있는 "정상적인 결과"가 필요합니다.
여기 제 코드가 있습니다. 엔티티 :
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@Entity
@Table(name = "TestTable")
public class TestTable {
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "Id")
private Integer id;
@Column(name = "OtherId")
private String otherId;
@Column(name = "CreationDate")
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@Column(name = "Type")
private Integer type;
}
투영 클래스 :
import lombok.Value;
@Value // This annotation fills in the "hashCode" and "equals" methods, plus the all-arguments constructor
public class IdsOnly {
private final Integer id;
private final String otherId;
}
저장소 :
public interface TestTableRepository extends JpaRepository<TestTable, Integer> {
@Query(value = "select Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true)
public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);
}
그리고 데이터를 얻으려고하는 코드는 다음과 같습니다.
@Autowired
TestTableRepository ttRepo;
...
Date theDate = ...
List<Integer> theListOfTypes = ...
...
Collection<IdsOnly> results = ttRepo.findEntriesAfterDate(theDate, theListOfTypes);
도와 주셔서 감사합니다. 나는 내가 뭘 잘못하고 있는지 이해하지 못한다.
해결법
-
==============================
1.쿼리는 생성자 표현식을 사용해야합니다.
쿼리는 생성자 표현식을 사용해야합니다.
@Query("select new com.example.IdsOnly(t.id, t.otherId) from TestTable t where t.creationDate > ?1 and t.type in (?2)")
그리고 저는 롬복을 모르지만 두 ID를 매개 변수로 사용하는 생성자가 있는지 확인하십시오.
-
==============================
2.봄 데이터를 사용하면 중간 사람을 잘라 간단하게 사용할 수 있습니다.
봄 데이터를 사용하면 중간 사람을 잘라 간단하게 사용할 수 있습니다.
public interface IdsOnly { Integer getId(); String getOtherId(); }
다음과 같은 원시 쿼리를 사용하십시오.
@Query(value = "Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true) public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections를 확인하십시오.
-
==============================
3.JPA 2.1은 고유하게 유지하려는 경우 흥미로운 ConstructorResult 기능을 도입했습니다.
JPA 2.1은 고유하게 유지하려는 경우 흥미로운 ConstructorResult 기능을 도입했습니다.
from https://stackoverflow.com/questions/49500309/spring-jpa-native-query-with-projection-gives-converternotfoundexception by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Java 파일 : 내용이 프롤로그에서 허용되지 않습니다. (0) | 2019.05.07 |
---|---|
[SPRING] 이름이 'entityManagerFactory'인 bean을 생성하는 중 오류가 발생했습니다. init 메소드를 호출하지 못했습니다. (0) | 2019.05.07 |
[SPRING] Google App Engine에서 환경 변수 / 앱 비밀번호를 설정하는 방법 (0) | 2019.05.07 |
[SPRING] grails app에 사용자 정의 groovy 파일에서 spring beans로드 (0) | 2019.05.07 |
[SPRING] Spring에서 국제화를 위해 여러 파일과 메시지를 처리하는 방법은 무엇입니까? (0) | 2019.05.07 |