Это может быть сделано с помощью Быть в спящем режиме Фильтра?

В моем приложении я имею Documents и Comments. A Comment принадлежит точно один Document, a Document может иметь несколько Comments.

У меня есть довольно сложный именованный запрос на моем Documents:

<query name="public.documents">
    <![CDATA[
       from Document d join d.someOtherProperty join ...
       where 
           ...
]]>
</query>

Набор результатов этого запроса должен теперь быть фильтрован согласно нескольким критериям. В отличие от всех примеров я мог найти на, в спящем режиме Фильтры, эти свойства не находятся в 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.

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

1
задан sebastiangeiger 10 July 2010 в 08:22
поделиться

2 ответа

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

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

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

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

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

Пример чего-то подобного есть на весенних форумах .

1
ответ дан 2 September 2019 в 23:08
поделиться

Пробовали ли вы это....

Если вы хотите заполнять документы, используя свойства Comment, используйте метод setProperties(obj) в Query. (При условии, что Comment закодирован в соответствии со стандартными соглашениями 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");

Все комментарии, созданные me....

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 и 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
ответ дан 2 September 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: