Jpa EclipseLink将本机查询结果放入POJO中-缺少[Class]的描述符

Jpa EclipseLink将本机查询结果放入POJO中-缺少[Class]的描述符,jpa,eclipselink,Jpa,Eclipselink,我正在使用EclipseLink运行一些本机SQL。我需要将数据返回到POJO中。我按照处的说明进行操作,但收到[Class]缺少描述符的错误 已命名查询列以匹配POJO的成员变量。我需要做一些额外的映射吗 POJO: 实体经理电话: public List<AnnouncementRecipientsFlattenedDTO> getNormalizedRecipientsForAnnouncement(int announcementId) { Query query =

我正在使用EclipseLink运行一些本机SQL。我需要将数据返回到POJO中。我按照处的说明进行操作,但收到[Class]缺少描述符的错误

已命名查询列以匹配POJO的成员变量。我需要做一些额外的映射吗

POJO:

实体经理电话:

public List<AnnouncementRecipientsFlattenedDTO> getNormalizedRecipientsForAnnouncement(int announcementId) {
    Query query = em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT, AnnouncementRecipientsFlattenedDTO.class);
    query.setParameter(1, announcementId);
    return query.getResultList();
}
public List getnormalizedRecipientsforenouncement(int-announcementId){
Query Query=em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT,announcementrecipientsplatteneddto.class);
query.setParameter(1,announcementId);
返回query.getResultList();
}

如果类已映射,则只能对该类使用本机SQL查询。您需要将announcementRecipientsFlattenedTo类定义为@Entity


否则,只需使用SQL创建本机查询,并获取数据数组,然后使用数据为自己构建数据。

如果类已映射,则只能对类使用本机SQL查询。您需要将announcementRecipientsFlattenedTo类定义为@Entity


否则,只需使用SQL创建本机查询,并获取数据数组,然后使用数据为自己构建数据。

我发现您可以将本机查询执行的结果放入包含对象的数组列表中。然后可以迭代列表和数组元素,并构建所需的实体对象

List<Object[]> rawResultList;

    Query query =
        em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT);
    rawResultList = query.getResultList();

    for (Object[] resultElement : rawResultList) {
        AnnouncementDeliveryLog adl = new AnnouncementDeliveryLog(getAnnouncementById(announcementId), (String)resultElement[1], (String)resultElement[2], "TO_SEND");
        persistAnnouncementDeliveryLog(adl);
    }
列表rawResultList;
查询=
em.createNamedQuery(AnnouncementDeliveryLog.FIND\u规范化的\u收件人\u用于\u公告);
rawResultList=query.getResultList();
对于(对象[]resultElement:rawResultList){
AnnouncementDeliveryLog adl=new AnnouncementDeliveryLog(getAnnouncementById(announcementId),(String)resultement[1],(String)resultement[2],“TO_SEND”);
persistensionDeliveryLog(adl);
}

我发现可以将本机查询执行的结果放入包含对象的数组列表中。然后可以迭代列表和数组元素,并构建所需的实体对象

List<Object[]> rawResultList;

    Query query =
        em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT);
    rawResultList = query.getResultList();

    for (Object[] resultElement : rawResultList) {
        AnnouncementDeliveryLog adl = new AnnouncementDeliveryLog(getAnnouncementById(announcementId), (String)resultElement[1], (String)resultElement[2], "TO_SEND");
        persistAnnouncementDeliveryLog(adl);
    }
列表rawResultList;
查询=
em.createNamedQuery(AnnouncementDeliveryLog.FIND\u规范化的\u收件人\u用于\u公告);
rawResultList=query.getResultList();
对于(对象[]resultElement:rawResultList){
AnnouncementDeliveryLog adl=new AnnouncementDeliveryLog(getAnnouncementById(announcementId),(String)resultement[1],(String)resultement[2],“TO_SEND”);
persistensionDeliveryLog(adl);
}

旧问题,但可能是以下解决方案将帮助其他人

假设您希望返回Oracle中给定表的列、数据类型和数据长度列表。我在下面写了一个本机示例查询:

  private static final String TABLE_COLUMNS = "select utc.COLUMN_NAME, utc.DATA_TYPE, utc.DATA_LENGTH "
        + "from user_tab_columns utc "
        + "where utc.table_name = ? "                
        + "order by utc.column_name asc";
现在需要根据上述查询的结果构造一个POJO列表

定义
TableColumn
实体类如下:

@Entity
public class TableColumn implements Serializable {

@Id
@Column(name = "COLUMN_NAME")
private String columnName;
@Column(name = "DATA_TYPE")
private String dataType;
@Column(name = "DATA_LENGTH")
private int dataLength;

public String getColumnName() {
    return columnName;
}

public void setColumnName(String columnName) {
    this.columnName = columnName;
}

public String getDataType() {
    return dataType;
}

public void setDataType(String dataType) {
    this.dataType = dataType;
}

public int getDataLength() {
    return dataLength;
}

public void setDataLength(int dataLength) {
    this.dataLength = dataLength;
}

public TableColumn(String columnName, String dataType, int dataLength) {
    this.columnName = columnName;
    this.dataType = dataType;
    this.dataLength = dataLength;
}

public TableColumn(String columnName) {
    this.columnName = columnName;
}

public TableColumn() {
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (columnName != null ? columnName.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {

    if (!(object instanceof TableColumn)) {
        return false;
    }
    TableColumn other = (TableColumn) object;
    if ((this.columnName == null && other.columnName != null) || (this.columnName != null && !this.columnName.equals(other.columnName))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return getColumnName();
}

}
现在,我们准备构建一个POJO列表。使用下面的示例代码构建并将结果作为POJO列表

public List<TableColumn> findTableColumns(String table) {
    List<TableColumn> listTables = new ArrayList<>();
    EntityManager em = emf.createEntityManager();
    Query q = em.createNativeQuery(TABLE_COLUMNS, TableColumn.class).setParameter(1, table);
    listTables = q.getResultList();
    em.close();
    return listTables;
}
公共列表findTableColumns(字符串表){
List listTables=新建ArrayList();
EntityManager em=emf.createEntityManager();
Query q=em.createNativeQuery(TABLE_COLUMNS,TableColumn.class).setParameter(1,TABLE);
listTables=q.getResultList();
em.close();
返回列表表;
}

旧问题,但可能是以下解决方案将帮助其他人

假设您希望返回Oracle中给定表的列、数据类型和数据长度列表。我在下面写了一个本机示例查询:

  private static final String TABLE_COLUMNS = "select utc.COLUMN_NAME, utc.DATA_TYPE, utc.DATA_LENGTH "
        + "from user_tab_columns utc "
        + "where utc.table_name = ? "                
        + "order by utc.column_name asc";
现在需要根据上述查询的结果构造一个POJO列表

定义
TableColumn
实体类如下:

@Entity
public class TableColumn implements Serializable {

@Id
@Column(name = "COLUMN_NAME")
private String columnName;
@Column(name = "DATA_TYPE")
private String dataType;
@Column(name = "DATA_LENGTH")
private int dataLength;

public String getColumnName() {
    return columnName;
}

public void setColumnName(String columnName) {
    this.columnName = columnName;
}

public String getDataType() {
    return dataType;
}

public void setDataType(String dataType) {
    this.dataType = dataType;
}

public int getDataLength() {
    return dataLength;
}

public void setDataLength(int dataLength) {
    this.dataLength = dataLength;
}

public TableColumn(String columnName, String dataType, int dataLength) {
    this.columnName = columnName;
    this.dataType = dataType;
    this.dataLength = dataLength;
}

public TableColumn(String columnName) {
    this.columnName = columnName;
}

public TableColumn() {
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (columnName != null ? columnName.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {

    if (!(object instanceof TableColumn)) {
        return false;
    }
    TableColumn other = (TableColumn) object;
    if ((this.columnName == null && other.columnName != null) || (this.columnName != null && !this.columnName.equals(other.columnName))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return getColumnName();
}

}
现在,我们准备构建一个POJO列表。使用下面的示例代码构建并将结果作为POJO列表

public List<TableColumn> findTableColumns(String table) {
    List<TableColumn> listTables = new ArrayList<>();
    EntityManager em = emf.createEntityManager();
    Query q = em.createNativeQuery(TABLE_COLUMNS, TableColumn.class).setParameter(1, table);
    listTables = q.getResultList();
    em.close();
    return listTables;
}
公共列表findTableColumns(字符串表){
List listTables=新建ArrayList();
EntityManager em=emf.createEntityManager();
Query q=em.createNativeQuery(TABLE_COLUMNS,TableColumn.class).setParameter(1,TABLE);
listTables=q.getResultList();
em.close();
返回列表表;
}

另外,别忘了在
persistence.xml
中添加POJO类!如果您习惯于使用IDE为您管理该文件,则很容易忽略这一点。

此外,不要忘记在
persistence.xml中添加POJO类!如果您习惯于使用IDE为您管理该文件,那么很容易忽略这一点。

遇到了类似的问题,我想返回POJO列表,实际上只是POJO(如果您愿意,可以称之为DTO),而不是@Entity注释对象

class PojoExample {

  String name;

  @Enumerated(EnumType.STRING)
  SomeEnum type;

  public PojoExample(String name, SomeEnum type) {
    this.name = name;
    this.type = type;
  }
}
使用以下查询:

String query = "SELECT b.name, a.newtype as type FROM tablea a, tableb b where a.tableb_id = b_id";

Query query = getEntityManager().createNativeQuery(query, "PojoExample");

@SuppressWarnings("unchecked")
List<PojoExample> data = query.getResultList();

只需将其放在@Entity注释下的任意位置(因此在本例中,可以在tablea或tableb中,因为PojoExample没有@Entity注释)

遇到了类似的问题,我想返回一个POJO列表,实际上只是POJO(如果需要,可以称之为DTO),而不是@Entity注释对象

class PojoExample {

  String name;

  @Enumerated(EnumType.STRING)
  SomeEnum type;

  public PojoExample(String name, SomeEnum type) {
    this.name = name;
    this.type = type;
  }
}
使用以下查询:

String query = "SELECT b.name, a.newtype as type FROM tablea a, tableb b where a.tableb_id = b_id";

Query query = getEntityManager().createNativeQuery(query, "PojoExample");

@SuppressWarnings("unchecked")
List<PojoExample> data = query.getResultList();

只需将其放在@Entity注释下的任意位置(因此,在本例中,无论是在tablea还是tableb中,因为PojoExample没有@Entity注释)

实体必须与表关联还是可以独立?这肯定是解决问题的答案。如果您想映射到DTO,那么您可以使用@sqlresultsetmappingd用户该实体是否必须与表关联,或者它是否可以是独立的?这肯定是解决问题的答案。如果您想映射到DTO,则可以使用@sqlresultsetmappingt用户。这将在DB中创建一个名为TableColumn的新表。还有其他解决方案吗?@scarface您似乎设置了除
none
之外的其他选项。避免生成tabl的原因有很多