可以使用Hibernate Filter完成吗?

时间:2010-07-10 08:22:24

标签: hibernate filter

在我的申请中,我有DocumentsCommentsComment只属于一个DocumentDocument可以有多个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

如果使用过滤器无法完成,你可以指向一个不同的解决方案,我认为这是一个相当普遍的问题,我认为为每个可能的限制标准组合编写查询远非优雅。

2 个答案:

答案 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();

15.16. Tips & Tricks

修改

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上有类似的例子。