eclipselink本机查询结果到pojo-missing descriptor for[class]

brqmpdu1  于 2021-07-26  发布在  Java
关注(0)|答案(5)|浏览(683)

我正在使用eclipselink运行一些本地sql。我需要将数据返回到pojo中。我按照eclipselink文档中的说明操作,但收到了错误消息 Missing descriptor for [Class] 已命名查询列以匹配pojo的成员变量。我需要做一些额外的Map吗?
波乔:

  1. public class AnnouncementRecipientsFlattenedDTO {
  2. private BigDecimal announcementId;
  3. private String recipientAddress;
  4. private String type;
  5. public AnnouncementRecipientsFlattenedDTO() {
  6. super();
  7. }
  8. public AnnouncementRecipientsFlattenedDTO(BigDecimal announcementId, String recipientAddress, String type) {
  9. super();
  10. this.announcementId = announcementId;
  11. this.recipientAddress = recipientAddress;
  12. this.type = type;
  13. }
  14. ... Getters/Setters

实体经理电话:

  1. public List<AnnouncementRecipientsFlattenedDTO> getNormalizedRecipientsForAnnouncement(int announcementId) {
  2. Query query = em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT, AnnouncementRecipientsFlattenedDTO.class);
  3. query.setParameter(1, announcementId);
  4. return query.getResultList();
  5. }
3pvhb19x

3pvhb19x1#

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

  1. List<Object[]> rawResultList;
  2. Query query =
  3. em.createNamedQuery(AnnouncementDeliveryLog.FIND_NORMALIZED_RECIPIENTS_FOR_ANNOUNCEMENT);
  4. rawResultList = query.getResultList();
  5. for (Object[] resultElement : rawResultList) {
  6. AnnouncementDeliveryLog adl = new AnnouncementDeliveryLog(getAnnouncementById(announcementId), (String)resultElement[1], (String)resultElement[2], "TO_SEND");
  7. persistAnnouncementDeliveryLog(adl);
  8. }
zynd9foi

zynd9foi2#

如果类已Map,则只能对该类使用本机sql查询。您需要将announcementRecipientsFlattenedTo类定义为@实体。
否则,只需使用sql创建本机查询,并获取一个数据数组,然后使用该数据构建dto。

qxsslcnc

qxsslcnc3#

老问题,但可能是下面的解决办法会帮助别人。
假设您希望返回oracle中给定表的列、数据类型和数据长度的列表。我在下面写了一个本机示例查询:

  1. private static final String TABLE_COLUMNS = "select utc.COLUMN_NAME, utc.DATA_TYPE, utc.DATA_LENGTH "
  2. + "from user_tab_columns utc "
  3. + "where utc.table_name = ? "
  4. + "order by utc.column_name asc";

现在需要根据上述查询的结果构造一个pojo列表。
定义 TableColumn 实体类如下:

  1. @Entity
  2. public class TableColumn implements Serializable {
  3. @Id
  4. @Column(name = "COLUMN_NAME")
  5. private String columnName;
  6. @Column(name = "DATA_TYPE")
  7. private String dataType;
  8. @Column(name = "DATA_LENGTH")
  9. private int dataLength;
  10. public String getColumnName() {
  11. return columnName;
  12. }
  13. public void setColumnName(String columnName) {
  14. this.columnName = columnName;
  15. }
  16. public String getDataType() {
  17. return dataType;
  18. }
  19. public void setDataType(String dataType) {
  20. this.dataType = dataType;
  21. }
  22. public int getDataLength() {
  23. return dataLength;
  24. }
  25. public void setDataLength(int dataLength) {
  26. this.dataLength = dataLength;
  27. }
  28. public TableColumn(String columnName, String dataType, int dataLength) {
  29. this.columnName = columnName;
  30. this.dataType = dataType;
  31. this.dataLength = dataLength;
  32. }
  33. public TableColumn(String columnName) {
  34. this.columnName = columnName;
  35. }
  36. public TableColumn() {
  37. }
  38. @Override
  39. public int hashCode() {
  40. int hash = 0;
  41. hash += (columnName != null ? columnName.hashCode() : 0);
  42. return hash;
  43. }
  44. @Override
  45. public boolean equals(Object object) {
  46. if (!(object instanceof TableColumn)) {
  47. return false;
  48. }
  49. TableColumn other = (TableColumn) object;
  50. if ((this.columnName == null && other.columnName != null) || (this.columnName != null && !this.columnName.equals(other.columnName))) {
  51. return false;
  52. }
  53. return true;
  54. }
  55. @Override
  56. public String toString() {
  57. return getColumnName();
  58. }
  59. }

现在我们准备构建一个pojo列表。使用下面的示例代码构造一个pojo列表,以获得您的结果。

  1. public List<TableColumn> findTableColumns(String table) {
  2. List<TableColumn> listTables = new ArrayList<>();
  3. EntityManager em = emf.createEntityManager();
  4. Query q = em.createNativeQuery(TABLE_COLUMNS, TableColumn.class).setParameter(1, table);
  5. listTables = q.getResultList();
  6. em.close();
  7. return listTables;
  8. }
展开查看全部
q1qsirdb

q1qsirdb4#

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

dkqlctbz

dkqlctbz5#

遇到了同样的问题,我想返回一个pojo列表,实际上只返回pojo(如果需要,可以称之为dto),而不是@entity注解对象。

  1. class PojoExample {
  2. String name;
  3. @Enumerated(EnumType.STRING)
  4. SomeEnum type;
  5. public PojoExample(String name, SomeEnum type) {
  6. this.name = name;
  7. this.type = type;
  8. }
  9. }

使用以下查询:

  1. String query = "SELECT b.name, a.newtype as type FROM tablea a, tableb b where a.tableb_id = b_id";
  2. Query query = getEntityManager().createNativeQuery(query, "PojoExample");
  3. @SuppressWarnings("unchecked")
  4. List<PojoExample> data = query.getResultList();

从数据库创建pojoexample,而不需要对pojoexample进行实体注解。您可以在这里的oracle文档中找到方法调用。
编辑:事实证明,您必须使用@sqlresultsetmapping才能工作,否则您的query.getresultlist()将返回一个对象列表。

  1. @SqlResultSetMapping(name = "PojoExample",
  2. classes = @ConstructorResult(columns = {
  3. @ColumnResult(name = "name", type = String.class),
  4. @ColumnResult(name = "type", type = String.class)
  5. },
  6. targetClass = PojoExample.class)
  7. )

只要把它放在@entity注解下就行了(所以在本例中可以放在tablea或tableb中,因为pojoexample没有@entity注解)

展开查看全部

相关问题