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>###

我如何用 Criteria 来表示它?
提前感谢您的关注和建议。


更新
作为答案指南之一,我得到了复合元素不可查询的观点,所以我制作了一个双向的一对多映射(上面已更改)现在我可以查询但现在我发现了另一个问题:
我怎样才能用外键映射复合ID
Message是这样的映射:

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

按照指示,一对多可以使用set而不是list,所以我很难找到满足我需要的样本(由于应该订购消息)。
有什么建议吗?我还在寻找那个。感谢帮助。

4

2 回答 2

1

您不能直接选择消息,因为它是组件而不是实体。组件没有独立的生命周期。它们不能自行查询、创建或删除,它们始终必须通过嵌入它们的实体(在您的情况下为 MessageSession)来访问。

为了使它成为一个实体,表应该有它自己的主键。在您的情况下,似乎并非如此。您将需要更改架构,以便与 Message 对应的表具有主键,并将映射更改为使用一对多而不是复合元素。

如果你不能这样做,你将不得不查询 MessageSession 并从中获取消息。

PS:Hibernate 相当复杂,我还没有看到有太多人能够在尝试的过程中将它捡起来。如果您花一些时间研究基本概念(这比映射和查询更重要),您更有可能成功。

于 2013-09-02T03:45:29.317 回答
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>

其中,不重要的被忽略了。

事情进展顺利,而我可以找到具有“许多”或相反限制的“一个”。像这样:

        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 回答