Как сделать запрос между или между запросами с Criteria API

как я могу выполнить запрос с помощью Criteria API между или между этим простым запросом sql:

SELECT * FROM
  documents
WHERE (register_date BETWEEN to_date('02.07.2017', 'DD.MM.YYYY') AND to_date('02.07.2018', 'DD.MM.YYYY'))
OR (sign_date BETWEEN to_date('02.07.2017', 'DD.MM.YYYY') AND to_date('02.07.2018', 'DD.MM.YYYY'));

в постгресе?

Это не дубликат, потому что я делаю запрос с ДВУМЯ между ними, а вопрос в приведенной ниже ссылке не имеет критериев API, как я вижу.

Мне нужно сделать что-то вроде этого

CriteriaBuilder cb = this.getCSession().getCriteriaBuilder();
CriteriaQuery<Documents> documentsCriteria = cb.createQuery(model_class);

Root<Documents> DocumentsRoot = documentsCriteria.from(model_class);
documentsCriteria.select(DocumentsRoot);

List<Predicate> predicates = new ArrayList<>();

if (register_start_date != null && register_end_date != null) {
    predicates.add(cb.between(DocumentsRoot.get("register_date"), register_start_date, register_end_date));
    predicates.add(cb.between(DocumentsRoot.get("sign_date"), register_start_date, register_end_date));
}

documentsCriteria.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));

List<Order> orderList = new ArrayList<>();
orderList.add(cb.asc(DocumentsRoot.get("register_date")));
orderList.add(cb.asc(DocumentsRoot.get("sign_date")));

documentsCriteria.orderBy(orderList);

Query q = this.getCSession().createQuery(documentsCriteria);

return (List<Documents>) q.getResultList();

person Nesquik27    schedule 07.11.2018    source источник
comment
Возможный дубликат JPQL SELECT между оператором даты   -  person michaeak    schedule 07.11.2018
comment
Было бы здорово, если бы вы могли показать свою попытку. Существует много похожих вопросов, таких как этот.   -  person Samuel Kok    schedule 07.11.2018


Ответы (1)


вы создаете критерии на основе диспетчера сущностей, а затем добавляете к нему ограничение между.

Criteria criteria = entityManager.unwrap(Session.class).createCriteria(EntityDao.class);
criteria.add(Restrictions.between("your_date_column", date1, date2));

между или между

criteria.add(Restrictions.or(Restrictions.between("your_date_column", date1, date2), Restrictions.between("your_date_column", date3, date4)));
person aurelius    schedule 07.11.2018
comment
Хорошо, на один между Все в порядке! как сделать между или между?! - person Nesquik27; 07.11.2018
comment
вы добавляете несколько ограничений к нему - person aurelius; 07.11.2018
comment
Если я создам следующий между, это будет между И между, но мне нужно между ИЛИ между - person Nesquik27; 07.11.2018
comment
критерии.добавить(Ограничения.или(Ограничения.между(ваша_дата_столбец, новая Дата(), новая Дата()), Ограничения.между(ваша_дата_столбец, новая Дата(), новая Дата()))); - person aurelius; 07.11.2018
comment
Мне нужно поместить что-то подобное в мои документыCriteria.where Если я сделаю predicates.add(cb.or(cb.between(DocumentsRoot.get(register_date), register_start_date, register_end_date), cb.between(DocumentsRoot.get(sign_date) ,дата_начала_регистрации,дата_окончания_регистрации))); чем количество строк не совпадает с обычным sql - person Nesquik27; 07.11.2018
comment
не могли бы вы уйти с оператором java? - person aurelius; 07.11.2018
comment
Хорошо, все работает правильно, это моя ошибка, всем спасибо! - person Nesquik27; 07.11.2018
comment
вы должны одобрить это тогда - person aurelius; 23.11.2018