0

enter code here我想对项目列表应用限制,因此只会检索给定日期的项目。

这是我的映射:

    <class name="MyClass" 
            table="MyTable" mutable="false" >
            <cache usage="read-only"/>
    <id name="myId" column="myId" type="integer"/>
    <property name="myProp" type="string" column="prop"/>
    <list name="items" inverse="true" cascade="none">
        <key column="myId"/>
        <list-index column="itemVersion"/>
        <one-to-many class="Item"/>
    </list> 
   </class>
    <class name="Item" 
            table="Items" mutable="false" >
            <cache usage="read-only"/>
    <id name="myId" column="myId" type="integer"/>
    <property name="itemVersion" type="string" column="version"/>
    <property name="startDate" type="date" column="startDate"/>
   </class>

我试过这段代码:

Criteria crit = session.createCriteria(MyClass.class);
crit.add( Restrictions.eq("myId", new Integer(1)));
crit = crit.createCriteria("items").add( Restrictions.le("startDate", new Date()) );

这导致以下问题:

select ...
from MyTable this_ inner join Items items1_ on this_.myId=items1_.myId 
where this_.myId=? and items1_.startDate<=?

其次是

select ...
from Items items0_ 
where items0_.myId=?

但我需要的是这样的:

select ...
from MyTable this_ 
where this_.myId=?

其次是

select ...
from Items items0_ 
where items0_.myId=? and items0_.startDate<=?

知道如何在项目列表上应用标准吗?

4

2 回答 2

0
Criteria crit = session.createCriteria(MyClass.class);
crit.add( Restrictions.eq("myId", new Integer(1)));
crit.setFetchMode( "items", FetchMode#JOIN );
crit = crit.createCriteria("items").add( Restrictions.le("startDate", new Date()) );

请注意,您正在创建该集合的“实时”过滤视图。如果您看到应该属于该集合的所有其他项目开始被删除的情况,那么您确切知道在哪里查找。

你更好的选择是直接查询你想要的项目列表:

String hql = "select i from MyClass m inner join m.items i where i.startDate <= :theDate";
List items = session.createQuery( hql )
        .setParameter( "theDate", theDate )
        .list();

您可以使用投影对 Criteria 执行相同的操作。

于 2012-05-23T12:40:06.673 回答
0

您在这里有两个选择: A)您可以在集合上
定义一个过滤器:"items"MyClass

<filter name="starDateFilter" condition="startDate <= :startDate"/>

然后,您将通过调用来应用它

session.enableFilter("startDateFilter").setParameter("startDate", new Date());

在检索您的对象之前。在这种情况下,您将只指定基于 的 Criteria MyClass,而不是 on Item(如果您需要 Criteria,您可以使用session.load()if all you need is id)。

B)将您的items收藏设置为延迟获取。查询(或通过 id 检索)您的对象,然后单独MyClass创建标准(不链接到): ItemMyClass

Criteria crit = session.createCriteria(Item.class);
crit.add( Restrictions.le("startDate", new Date()) );

这将返回一个列表Items(从您的映射来看,无论如何都没有返回链接MyClass)。选项 (B) 将生成您正在寻找的 SQL 查询。

于 2009-07-13T17:37:05.397 回答