EclipseLink native query result into POJO - Missing descriptor for [Class]

前端 未结 5 829
悲&欢浪女
悲&欢浪女 2020-12-17 10:18

I\'m using EclipseLink to run some Native SQL. I need to return the data into a POJO. I followed the instructions at EclipseLink Docs, but I receive the error Missing

5条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-17 11:23

    Old question but may be following solution will help someone else.

    Suppose you want to return a list of columns, data type and data length for a given table in Oracle. I have written below a native sample query for this:

      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";
    

    Now the requirement is to construct a list of POJO from the result of above query.

    Define TableColumn entity class as below:

    @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();
    }
    
    }
    

    Now we are ready to construct a list of POJO. Use the sample code below to construct get your result as List of POJOs.

    public List findTableColumns(String table) {
        List 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;
    }
    

提交回复
热议问题