У меня возникли проблемы с сгенерированным оператором SQL из Hibernate.Я хочу получить всех пользователей с их днем рождения в течение определенного периода времени или в определенный день.В то время как оператор для определенного дня работает нормально, другой просто возвращает первых n пользователей, где n - количество правильных пользователей.
Учитывая эти данные:
ID name birthdate
1 firstUser 12.07.1990
2 user1 25.04.2007
3 user2 15.05.1992
4 user3 01.04.1988
Сначаласгенерированный оператор для определенного дня:
select
*
from
( select
distinct *
from
USERS user0_
where
calculateNextBirthday(user0_.birthDate) = TO_DATE('25.04.2018', 'dd.MM.yyyy')
order by
user0_.id asc )
where
rownum <= ?; // This will be the row count of this statement with the same where clause, i.e. 1 if there is only 1 matching user
Как я уже сказал, этот оператор возвращает правильного пользователя (user1 с идентификатором 2
).
Тот же оператор с интервалом между:
select
*
from
( select
distinct *
from
USERS user0_
where
calculateNextBirthday(user0_.birthDate) between TO_DATE('01.04.2018', 'dd.MM.yyyy') and TO_DATE('30.04.2018', 'dd.MM.yyyy')
order by
user0_.id asc )
where
rownum <= ?; // This will be the row count of this statement with the same where clause, i.e. 1 if there is only 1 matching user
У этого персонажа странное поведение.Если я выполню внутренний оператор выбора, результат будет содержать правильных пользователей (user1
).Но, выполнив весь оператор, он вернет первого пользователя (firstUser
с идентификатором 1
).Изменение даты следующим образом:
select
*
from
( select
distinct *
from
USERS user0_
where
calculateNextBirthday(user0_.birthDate) between TO_DATE('01.04.2018', 'dd.MM.yyyy') and TO_DATE('30.06.2018', 'dd.MM.yyyy')
order by
user0_.id asc )
where
rownum <= ?; // This will be the row count of this statement with the same where clause, i.e. 1 if there is only 1 matching user
вернет первых двух пользователей (firstUser
и user1
), потому что есть два подходящих пользователя (user1
и user2
)
И если я удаляю rownum из внешнего оператора, он возвращает только правильных пользователей (пример ниже возвращает user1
).
select
*
from
( select
distinct *
from
USERS user0_
where
calculateNextBirthday(user0_.birthDate) between TO_DATE('01.04.2018', 'dd.MM.yyyy') and TO_DATE('30.04.2018', 'dd.MM.yyyy')
order by
user0_.id asc )
Так что я понятия не имею, где Oracle получает первую запись пользователя.
Я что-то здесь не так делаю или есть ошибка в Oracle Oracle Database 10g Express Edition Release 10.2.0.10,0