Результат наложения даты в спящем поиске - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть два столбца в базе данных на дату:

  1. START_DATE
  2. END_DATE

Я использую запрос диапазона, чтобы получить результат. Мой запрос:

Query startDateQuery = queryBuilder.range().onField("eventsSet.startDate").above(java.sql.Date.valueOf(startDate)) 
                .createQuery();
Query endDateQuery = queryBuilder.range().onField("eventsSet.endDate").below(java.sql.Date.valueOf()) 
                .createQuery();
queryBuilder.bool().must(startDateQuery).should(endDateQuery).createQuery();

Это не дает правильный результат.

Я также хочу вернуть дату перекрытия. Например: startDate = 2020-04-07 и endDate = 2020-04-14

он должен возвращать записи, имеющие диапазон, а также даты перекрытия, такие как запись, имеющая startDate = 2020-04-01 и endDate = 2020-04-15.

Как получить его в поиске Hibernate?

1 Ответ

0 голосов
/ 28 апреля 2020

В вашем запросе есть две проблемы:

  1. Вы свободно используете must и should. Они не одно и то же. В основном:
    • , если вам нужно «ИЛИ», создайте логический запрос только с предложениями «должен». Например, queryBuilder.bool().should(subquery1).should(subquery2).createQuery(); означает «подзапрос1 ИЛИ подзапрос2».
    • , если вам нужно «И», создайте логический запрос только с предложениями «must». Например, queryBuilder.bool().must(subquery1).must(subquery2).createQuery(); означает «подзапрос1 И подзапрос2».
    • Если вам нужны и «И», и «ИЛИ», обязательно создайте отдельный логический запрос. Например, queryBuilder.bool().must(subquery1).must(queryBuilder.bool().should(subquery2).should(subquery3).createQuery()).createQuery(); означает «подзапрос1 И (подзапрос2 ИЛИ подзапрос3)».
  2. Вы не указали правильное условие для перекрытия интервалов. Правильное условие: interval1StartDate <= interval2EndDate AND interval2StartDate <= interval1EndDate
...