2017-05-05 5 views
0

와 나는 다음과 같은 문장을문제는 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을 사용하고 있습니다.

+0

실제로 데이터베이스에서 선택하는 필드가있는 엔티티를 정의하지 않는 이유는 무엇입니까? JPA에 결과가 특정 클래스 인 경우 모든 속성이 결과 세트에서 추출되었는지 확인합니다. 결과 집합의 값은 null 일 수 있지만 결과 집합 내의 열이 있어야합니다. – Matthias

+0

선택한 조합이 정적 인 경우 엔터티를 만들었을 것입니다. 쿼리 빌더를 사용 중이며 모든 열의 조합을 선택할 수 있습니다. 선택한 열을 동적으로 만들 수있는 다른 방법이 있습니까? – yaswanth

+0

동적 인 양의 컬럼을 선택하면이를 엔티티에 매핑하는 것은 이상한 일입니다. 물론 다른 컬럼을 null 값으로 선택하기 위해 SQL 쿼리를 다시 작성할 수 있습니다. 즉, 테이블에서 검색하지 않으려는 각 열은 쿼리에 "null AS "으로 포함됩니다. 그건 위의 경우에 "선택 a.colA로 colA, a.colB로 colB, null로 colC, null로 colA로 tableA 대답" – Matthias

답변

1

resultClass을 지정하지 않으면 JPA는 사용자에게 제공 할 결과 유형을 알 수 없으므로 모든 열 값의 배열을 반환합니다. 각 Object[]은 하나의 반환 된 행입니다.

colC 및 colD를 가져 오지 않지만 결과 클래스를 사용하려는 경우 해당 이름 및 데이터 유형의 가짜 필드에 입력해야합니다.

List<TableA> tableAList = (List<TableA>) entityManager.createNativeQuery(
        "select colA, colB, null as colC, null as colD from tableA", 
        TableA.class).getResultList(); 

필드가 원시적 인 경우 null 대신 0을 사용하십시오.

+0

나에게 이것을위한 ResultHandler 종류의 구성이나 무언가가 있습니까? 왜냐하면 나는 각각의 쿼리에 더미 null과 기본 프리미티브 값을 포함하고 싶지 않기 때문이다. – yaswanth

+0

아니요. 그러나 더 작은 다른 Entity 클래스를 만들어 사용할 수는 있습니다. – coladict

+0

나는 그것을 할 수 없다. 내 엔티티 클래스는 일반적으로 최대 15 개의 필드를 포함하며 그 중 어떤 조합도 선택할 수 있습니다. – yaswanth