[英]One-to-many with criteria
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<=?
知道如何在项目列表中应用条件吗?
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();
您可以使用投影对条件进行相同的处理。
您在这里有两个选择:
A)您可以在MyClass
"items"
集合上定义过滤器:
<filter name="starDateFilter" condition="startDate <= :startDate"/>
然后,您可以通过致电应用
session.enableFilter("startDateFilter").setParameter("startDate", new Date());
在检索对象之前。 在这种情况下,您将仅基于MyClass
而不是基于Item
指定Criteria(如果您完全需要Criteria,则仅在需要id
时才可以使用session.load()
)。
B)将您的items
集合设置为延迟获取。 查询(或按ID检索) MyClass
对象,然后仅基于Item
创建条件(不链接到MyClass
):
Criteria crit = session.createCriteria(Item.class);
crit.add( Restrictions.le("startDate", new Date()) );
这将返回一个Items
列表(从映射中判断,该链接MyClass
没有指向MyClass
的链接)。 选项(B)将产生您要查找的SQL查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.