我正在使用EclipseLink来运行一些Native SQL.我需要将数据返回到POJO中.我按照EclipseLink Docs上的说明进行操作,但收到错误Missing descriptor for [Class]
已命名查询列以匹配POJO的成员变量.我需要做一些额外的映射吗?
POJO:
public class AnnouncementRecipientsFlattenedDTO {
private BigDecimal announcementId;
private String recipientAddress;
private String type;
public AnnouncementRecipientsFlattenedDTO() {
super();
}
public AnnouncementRecipientsFlattenedDTO(BigDecimal announcementId, String recipientAddress, String type) {
super();
this.announcementId = announcementId;
this.recipientAddress = recipientAddress;
this.type = type;
}
... Getters/Setters
Run Code Online (Sandbox Code Playgroud)
实体经理致电:
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();
}
Run Code Online (Sandbox Code Playgroud)
ret*_*dev 11
我发现你可以将Native Query执行的结果放入一个包含对象的数组列表中.然后,可以遍历列表和Array元素并构建所需的Entity对象.
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);
}
Run Code Online (Sandbox Code Playgroud)
如果映射了类,则只能对类使用本机SQL查询.您需要将AnnouncementRecipientsFlattenedDTO类定义为@Entity.
否则,只需使用SQL创建本机查询并获取数据数组,然后使用数据自行构建DTO.
老问题但可能是以下解决方案将帮助别人.
假设您要返回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";
Run Code Online (Sandbox Code Playgroud)
现在要求是从上面的查询结果构造一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们准备构建一个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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26672 次 |
| 最近记录: |