0

みんな。私はHibernateを使用して真新しいです。

ここで質問に直面します。以下のようなエンティティがあります。

<class name="cn.edu.scau.librarica.dao.MessageSession" table="msg_session">
    <id name="msid" type="long" unsaved-value="null">
        <generator class="identity"/>
    </id>

    <list name="msgs" cascade="all">
        <key column="msid" 
            update="false" unique="true" not-null="true"/>
        <list-index column="list_index"/>
        <one-to-many class="Message" />
    </list>
</class>

そして今、私が達成したいことは次のとおりです。

    select Message m where msid=# and m.t<## and m.t>###

基準でどのように表現できますか?
事前にご注意とアドバイスをいただき、ありがとうございます。


更新
回答ガイドの1つとして、複合要素はクエリ可能ではないという点があるので、両方のサイドの1対多マップを作成しました(変更は上記です)そして、クエリを実行できるようになりましたが、別の問題が見つかりました:
複合 ID を外部キーにマップするにはどうすればよい
Messageですか? 次のようにマップします。

<class name="Message">
    <composite-id>
         <generator class="foreign">
             <!-- What here??? -->
         </generator>
    </composite-id>
</class>

指示どおり、1対多はsetではなくを使用する可能性listがあるため、ニーズを満たすサンプルがほとんど見つかりません(メッセージを注文する必要があるため)。
何かアドバイス?私はまだそれを探しています。手伝ってくれてありがとう。

4

2 に答える 2

0

質問者はこちらです。

数日間の調査の後、私は自分の要求を何とか満たす方法を見つけました。

マッピングMessage

<class name="cn.edu.scau.librarica.dao.Message" table="message">
    <id name="id" type="long">
        <generator class="identity" />
    </id>

    <many-to-one name="ms" class="cn.edu.scau.librarica.dao.MessageSession" 
     column="msid" not-null="true" insert="false" update="false" />
    <property name="s" type="long" />
    <property name="t" type="timestamp" />
    <property name="m" type="string" />
</class>

マッピングMessageSession

<class name="cn.edu.scau.librarica.dao.MessageSession" table="msg_session">
    <id name="msid" type="long" unsaved-value="null">
        <generator class="identity"/>
    </id>

    <property name="latest" type="timestamp" />

    <list name="msgs" table="msg_session_msgs" cascade="all">
        <key column="msid" 
            update="false" not-null="true"/>
        <list-index column="list_index"/>
        <one-to-many class="cn.edu.scau.librarica.dao.Message" />
    </list>
</class>

その中で、重要でないものは無視されます。

「多」またはその逆の制限のある「1」を見つけることができる間、物事は非常にうまくいきます。ちょうどこのような:

        DetachedCriteria dc = DetachedCriteria.forClass(Message.class)
            .createCriteria("ms")
            .add(Restrictions.eq("msid", msid));

        if (after != null)
            dc.add(Restrictions.gt("t", after));

        if (before != null)
            dc.add(Restrictions.lt("t", before));

...指定しMessageた期間中から指定した範囲で検索できますMessageSession

したがって、オブジェクトはエンティティとして一致しない限り、基準によって返されることはありません。

Message基になるデータベースでは、によって一意に識別できるため、少し冗長になる(msid,list_index)ため、 <-this を の主キーとして一致させる方法を見つけていますMessage

于 2013-09-04T13:35:50.040 に答える