В моем приложении я имею 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
.
Если это не может быть сделано с помощью фильтра, может Вы указывать на меня к другому решению, я думаю, что это - довольно типичная проблема, и я думаю, что запись запроса для каждой возможной комбинации критериев ограничения совсем не изящна.
Я не пробовал, но считаю, что это можно сделать с помощью фильтров.
Помимо фильтрации сущностей, фильтры могут использоваться для фильтрации коллекций, таких как коллекция комментариев, связанных с документом.
Вы определяете фильтры для комментариев и активируете их, что-то вроде этого для объекта Doucment:
<set ...>
<filter name="commentMadeAfter" condition=":commentDate <= commentDate"/>
<filter name="commentMadeBy" condition=":commentUser = userId"/>
</set>
Затем это ограничивает комментарии, извлекаемые для каждого документа, указанными критериями. Чтобы возвращенные документы содержали только комментарии, соответствующие этому критерию, вы также добавляете фильтр (или предложение where к запросу), чтобы исключить документы без комментариев из набора результатов.
Пример чего-то подобного есть на весенних форумах .
Пробовали ли вы это....
Если вы хотите заполнять документы, используя свойства 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();
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;
}
............
}