Можно ли это сделать с помощью фильтра Hibernate? - PullRequest
1 голос
/ 10 июля 2010

В моем приложении у меня есть 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, которые были добавлены в определенную дату.Или оба вышеупомянутых ограничения.

Сейчас я делаю это так:

<query name="public.documents.restricted.to">
    <![CDATA[
       from Document d join d.someOtherProperty join ...
       where 
           ...
           AND d.id IN (:restrictedTo)
]]>
</query>

Это очень уродливый способ достижения моей цели.Могу ли я сделать это с фильтром гибернации?Я понял, что фильтр - это всего лишь тонкая оболочка для дополнительных where аргументов, в моем случае мне понадобится какой-то join.

Если это невозможно сделать с помощью фильтра, можете ли вы указать мне надругое решение, я думаю, что это довольно распространенная проблема, и я думаю, что написание запроса для каждой возможной комбинации критериев ограничения далеко не элегантно.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Я не пробовал, но я думаю, что вы можете сделать это с помощью фильтров.

Помимо фильтрации сущностей, фильтры можно использовать для фильтрации собраний, таких как собрание комментариев, связанных с документом.

Вы определяете фильтры для Комментариев и активируете их, что-то вроде этого на сущности Doucment:

<set ...>
    <filter name="commentMadeAfter" condition=":commentDate <= commentDate"/>
    <filter name="commentMadeBy" condition=":commentUser = userId"/>
</set>

После этого комментарии к каждому документу будут ограничены указанными критериями. Чтобы в возвращаемых документах содержались только комментарии, соответствующие этому критерию, вы также добавляете фильтр (или предложение where к запросу), чтобы исключить документы без комментариев из набора результатов.

Есть пример чего-то похожего на весенних форумах .

1 голос
/ 12 июля 2010

Вы пробовали это ....

Если вы хотите подать документы, используя свойства 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. Советы и хитрости

EDIT:

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;
    }
    ............
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...