在我的申请中,我有Documents
和Comments
。 Comment
只属于一个Document
,Document
可以有多个Comments
。
我的Documents
上有一个相当复杂的命名查询:
<query name="public.documents">
<![CDATA[
from Document d join d.someOtherProperty join ...
where
...
]]>
</query>
现在应根据多个条件筛选此查询的结果集。与我在Hibernate Filters上找到的所有示例不同,这些属性不在Document
类中,而在Comment
类中。例如,我希望能够添加一个过滤器,该过滤器仅向我显示结果集中的Documents
,该结果集由特定作者Comments
或已添加Comments
的{{1}}某个约会。或者两种上述限制。
现在我这样做:
<query name="public.documents.restricted.to">
<![CDATA[
from Document d join d.someOtherProperty join ...
where
...
AND d.id IN (:restrictedTo)
]]>
</query>
这是实现目标的一种非常难看的方式。我可以使用休眠过滤器吗?我理解过滤器只是附加where
参数的一个薄包装器,在我的例子中我需要某种join
。
如果使用过滤器无法完成,你可以指向一个不同的解决方案,我认为这是一个相当普遍的问题,我认为为每个可能的限制标准组合编写查询远非优雅。
答案 0 :(得分:1)
你试过这个......
如果要使用Comment的属性来文件管理文件,请使用Query的setProperties(obj)方法。 (前提是注释是根据标准JavaBean约定编写的。)
Query q = session.createQuery(
"select doc from Document as doc join doc.comments as com where com.createdBy=:createdBy and com.createdDate=:createdDate");
Comment comment = new Comment();
comment.setCreatedBy("Me");
comment.setCreatedDate(new Date());
q.setProperties(comment);
List<Document> docs = q.list();
修改强>
session.createQuery("select doc from Document as doc join doc.comments as com where com.name like :name and com.createdDate >= :minDate and com.createdDate <= :maxDate");
我创作的所有评论......
Comment c = new Comment();
Calendar cal = GregorianCalendar.getInstance();
cal.add(Calendar.MONTH, -2010);
c.setMinDate(cal.getTime());
c.setMaxDate(new Date());
c.setCreatedBy("ME");
q.setProperties(c);
我昨天创作的所有评论......
Comment c = new Comment();
c.setMinDate(${yesterDay});
c.setMaxDate(${yesterDay});
c.setCreatedBy("ME");
q.setProperties(c);
所有评论(由任何人创建)toDate to fromDate ...
Comment c = new Comment();
c.setMinDate(${toDate});
c.setMaxDate(${fromDate});
c.setCreatedBy("%");
q.setProperties(c);
你必须修改Comment.java才能使这个工作......
public class Comment {
/* these are not persistent properties, just search fields */
private Date minDate;
private Date maxDate;
public Date getMinDate() {
return minDate;
}
public void setMinDate(Date minDate) {
this.minDate = minDate;
}
public Date getMaxDate() {
return maxDate;
}
public void setMaxDate(Date maxDate) {
this.maxDate = maxDate;
}
............
}
答案 1 :(得分:1)
我还没试过,但我相信你可以用过滤器做到这一点。
除了过滤实体,过滤器还可用于过滤集合,例如与文档相关的注释集合。
您可以为评论定义过滤器并激活这些过滤器,例如Doucment实体:
<set ...>
<filter name="commentMadeAfter" condition=":commentDate <= commentDate"/>
<filter name="commentMadeBy" condition=":commentUser = userId"/>
</set>
然后,这会将在每个文档上检索到的注释限制为指定的条件。为确保返回的文档仅包含符合此条件的注释,还要添加过滤器(或查询的where子句)以排除结果集中没有注释的文档。
spring forums上有类似的例子。