0

Oracle DB から一部のデータを取得し、それを別のアプリケーションがインポートできるように XML に変換するアプリケーションを継承しました。このようにする必要がある理由の背後にある理由は少し長くなりますが、要するに次のようなデータベースがあります。

ID | CHILD_ID | IRRELEVANT_COLUMN
1  | 100      | A
2  | 200      | E
2  | 200      | B
3  | 300      | G
3  | 300      | ZZ
3  | 300      | WHO_KNOWS_WHAT_MIGHT_END_UP_HERE

ID と CHILD_ID の値のみを使用します。以前は IRRELEVANT_COLUMN がなかったため、各 ID は一意であり、次のコードを使用して DB からデータを取得しました。

public static List<RecordInfo> getRecordInfo() {
    List<RecordInfo> recordInfo = null;
    Session session = HibernateUtils.getSessionFactory().openSession();
    try {
        recordInfo = session.createCriteria(RecordInfo.class)
                .list();
    }
    catch (Exception e) {
        logger.error("Error reading database", e);
    }
    return recordInfo;
}

RecordInfo.java:

public class RecordInfo {

    private Long id;

    private Event event;

    private Integer childId;

    //Snip - Public Getters and Setters below.
}

RecordInfo.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.hewhowas.model.RecordInfo" table="NIGHTMARE_TABLE" lazy="false">
    <id name="id" type="long" column="ID">
        <generator class="native"/>
    </id>
    <property name="childId">
        <column name="CHILD_ID"/>
    </property>
    <many-to-one name="event" class="com.hewhowas.model.Event" column="CHILD_ID" fetch="join"/>
</class>

Projections を使用してデータを ID でグループ化しようとしましたが、列 ID のみを取得し、他には何も取得しませんでした。また、RecordInfo オブジェクトをキャストしようとするとキャスト例外が発生します。

Criteria と Projections を使用して次のような結果セットを返す方法はありますか?

ID | CHILD_ID | IRRELEVANT_COLUMN
1  | 100      | A
2  | 200      | B
3  | 300      | WHO_KNOWS_WHAT_MIGHT_END_UP_HERE

「IRRELEVANT_COLUMN」の情報はいかなる方法でも使用されないため、取得された正確なレコードがアプリケーションに影響を与えることはありません。ID が 1 のレコードが 1 つだけ返され、1 つだけが返されるようにする必要があります。 2 の ID を持つレコードが返されます。

十分な情報があることを願っています。よろしくお願いします:)

4

2 に答える 2

1

プロジェクションを試したときに何を試したのか正確にはわかりません。それを念頭に置いて、次のことを試してみることをお勧めします。

query.add(Projections.property(Id)).add(Projections.property(Child_id)).add(Projections.property(Irrelevant_Column)).add(Projections.groupProperty(Id))

これには複数の書き方があることを述べたいと思います。基本的に、これは以下と同等です:

select id, child_id, irrelevant_column
from RecordInfo
group by id 
于 2013-11-15T14:54:53.917 に答える