1

休止状態で次のことが達成できるかどうか疑問に思っています。次の DTO を考慮します。

public class ClassDTO {
    private String className;
    private List<String> studentNames;
    //getters & setters
}

および sql-query を含む次の hbm ファイル:

<hibernate-mapping>
    <class name="app.ClassDTO">
        <id name="className" type="java.lang.String" />
        <property name="studentNames" type="java.lang.List" />
    </class>

    <sql-query name="classQuery">
        <return alias="class" class="app.ClassDTO" />
            select classTable.CLASS_NAME AS {class.className}, ST.STUDENT_NAME
             from CLASS classTable
            join STUDENT ST on ST.CLASS_ID=classTable.CLASS_ID
            where ST.age<18
    </sql-query>
</hibernate-mapping>

データベースでクエリを実行すると、次の結果が得られます。

+----------+------------+
|CLASS_NAME|STUDENT_NAME|
+----------+------------+
|  CS106   |   BILL     |
|  CS106   |   GEORGE   |
|  CS106   |   MICHEL   |
|  ELEC8   |   WILL     |
|  ELEC8   |   MIKE     |
|  ELEC8   |   BETTY    |
+----------+------------+

休止状態でクエリを実行すると、ClassDTO オブジェクトのリストを取得することになっています。しかし、次の方法でそれらのオブジェクトを初期化することは可能ですか?

List<ClassDTO> result = getHibernateTemplate.findByNamedQuery("classQuery").;
resul.size(); //<-- the list size should be 2 (one entry for CS106 and another for ELEC8)
result.get(0).getStudentNames().size(); //<-- the size should be 3 for BILL, GEORGE and MICHEL who are linked to the class CS106

休止状態のドキュメントを検索しましたが、まだ答えを見つけることができませんでした。どんな助けも本当に感謝しています。よろしくお願いします。

4

1 に答える 1

0

データをもう少し正規化し、マッピングを微調整すると、Hibernate にこれを自動的に実行させることができます。

<class name="app.ClassDTO">
    <id name="className" type="java.lang.String" />
    <list name="studentNames" table="class_student">
    <key column="class_name" />
        <element type="string"/>
    </list>
</class>

認めますが、存在する唯一のデータが実際にこれらの 2 つの列である場合、正規化はばかげているように見えます。しかし、Hibernate でフラットなテーブル データを複雑なオブジェクト構造に自動的に変換するには、一定のルールに従う必要があります (この特定のケースではベスト プラクティスとは言えません)。

テーブルをそのままにしたい場合は、自分で ClassDTO を作成する必要がありますが、それほど難しくありません。

final List<Object[]> resultObjects = getSession().getNamedQuery().list();
public Map<String, ClassDTO> resultMap = new HashMap<>(String, ClassDTO);
for (Object[] result : resultObjects) {
    // find ClassDTO in map for class, or create new one
    // add student name to class dto instance
}
于 2012-12-19T17:58:42.133 に答える