와 나는 다음과 같은 문장을문제는 JPA 2.0 EnityManger.createNativeQuery
List<TableA> tableAList = (List<TableA>) entityManager.
createNativeQuery(
"select colA, colB from tableA",
TableA.class)
.getResultList();
TableA의 실체
@Enitity
@Column(name = "tableA")
public class TableA {
@Id
private Integer id;
@Column(name = "colA")
private Integer colA;
@Column(name = "colB")
private Integer colB;
@Column(name = "colC")
private Integer colC;
@Column(name = "colD")
private Integer colD;
/*
Corresponding getters and setters. Excluding them for brevity.
*/
}
위의 쿼리는 "COLC는"찾을 수 없다는 예외 : SQLException을 던진다을 실행하고 있습니다. 선택 목록에 colC를 추가하면 "colD"가 없습니다. 기본적으로 테이블의 모든 열이 선택 쿼리에 포함될 것으로 예상됩니다. resultClass를 추가하지 않고 응답을 List<Object[]>
으로 받으면 동일한 오류가 발생하지 않습니다. 누구든지이 문제가 발생하는 이유를 설명 할 수 있습니까?
나머지 필드를 null로 설정하거나 (기본 필드가있는 경우 기본 기본 요소) List로 응답을 가져 오는 방법이 있습니까?
스택 트레이스 :
java.sql.SQLException: Column 'colC' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1077)
at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2759)
at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:63)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:260)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:256)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:246)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:332)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:802)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727)
at org.hibernate.loader.Loader.processResultSet(Loader.java:985)
at org.hibernate.loader.Loader.doQuery(Loader.java:943)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2153)
at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:991)
at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:147)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)
at org.hibernate.query.Query.getResultList(Query.java:146)
참고 : 나는 JPA 2.0을 사용하고 있습니다.
실제로 데이터베이스에서 선택하는 필드가있는 엔티티를 정의하지 않는 이유는 무엇입니까? JPA에 결과가 특정 클래스 인 경우 모든 속성이 결과 세트에서 추출되었는지 확인합니다. 결과 집합의 값은 null 일 수 있지만 결과 집합 내의 열이 있어야합니다. – Matthias
선택한 조합이 정적 인 경우 엔터티를 만들었을 것입니다. 쿼리 빌더를 사용 중이며 모든 열의 조합을 선택할 수 있습니다. 선택한 열을 동적으로 만들 수있는 다른 방법이 있습니까? – yaswanth
동적 인 양의 컬럼을 선택하면이를 엔티티에 매핑하는 것은 이상한 일입니다. 물론 다른 컬럼을 null 값으로 선택하기 위해 SQL 쿼리를 다시 작성할 수 있습니다. 즉, 테이블에서 검색하지 않으려는 각 열은 쿼리에 "null AS"으로 포함됩니다. 그건 위의 경우에 "선택 a.colA로 colA, a.colB로 colB, null로 colC, null로 colA로 tableA 대답" –
Matthias