我正在运行以下语句

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[]>获得,则不会发生相同的错误。谁能解释为什么会发生这种现象?

有没有一种方法可以像List一样将其余字段设置为null(如果有任何原始字段,则为默认原始值)来获取响应?

堆栈跟踪:

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。

最佳答案

当您不指定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();


如果您的字段碰巧是原始字段,请使用0而不是null。

07-24 19:55