17

EclipseLink を使用してネイティブ SQL を実行しています。データを POJO に返す必要があります。EclipseLink Docsの指示に従いましたが、エラーが表示されますMissing descriptor for [Class]

クエリ列には、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

エンティティ マネージャの呼び出し:

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

5 に答える 5

11

ネイティブ クエリの実行結果を、オブジェクトを保持する配列のリストに入れることができることがわかりました。次に、リストと配列要素を反復処理して、目的の 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);
    }
于 2013-03-11T14:33:33.410 に答える
9

また、POJO クラスを に追加することを忘れないでくださいpersistence.xml。そのファイルを管理する IDE に慣れていると、見落としがちです。

于 2014-03-07T20:23:53.807 に答える
9

クラスがマップされている場合、クラスでネイティブ SQL クエリのみを使用できます。AnnouncementRecipientsFlattenedDTO クラスを @Entity として定義する必要があります。

それ以外の場合は、SQL のみを使用してネイティブ クエリを作成し、データの配列を取得して、データを使用して自分で DTO を構築します。

于 2013-02-25T16:36:02.050 に答える
9

古い質問ですが、解決策に従っている可能性があり、他の人に役立ちます。

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;
}
于 2013-10-31T17:00:19.103 に答える