private DetachedCriteria buildhibernateQuery(Collection<String> internalIds, Session session, ProcessInstanceFilter filter, Integer offset, Integer limit) {
DetachedCriteria criteria = DetachedCriteria.forClass(ProcessInstance.class, "ids");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria = criteria.add(Restrictions.in("internalId", internalIds));
if (filter.getCreatedAfter() != null) {
criteria = criteria.add(Restrictions.gt("createDate", filter.getCreatedAfter()));
}
if (filter.getCreatedBefore() != null) {
criteria = criteria.add(Restrictions.lt("createDate", filter.getCreatedBefore()));
}
if (filter.getCreators() != null && !filter.getCreators().isEmpty()) {
criteria = criteria.add(Restrictions.in("creator", filter.getCreators()));
}
if (filter.getUpdatedAfter() != null) {
criteria = criteria
.createCriteria("processLogs")
.add(Restrictions.gt("entryDate", filter.getUpdatedAfterCalendar()));
}
if (filter.getNotUpdatedAfter() != null) {
DetachedCriteria entryDateCriteria = DetachedCriteria.forClass(ProcessInstanceLog.class).add(Restrictions.gt("entryDate", filter.getNotUpdatedAfterCalendar()));
criteria = criteria
.createCriteria("processLogs")
.add(Restrictions.not(Subqueries.exists(entryDateCriteria)));
}
return criteria;
}