Простой запрос HQL / sql. Нужна помощь? - PullRequest
0 голосов
/ 04 августа 2011

У меня есть 2 таблицы (сущность) сущность человека и сущность отпуска. Один человек может иметь много отпусков.

Я пытаюсь выполнить следующий запрос:

Выберите весь период лиц !, но для людей, у которых есть каникулы, я хочу выбрать все отпуска людей, у которых есть условие, чтобы просто сказать, что startDate находится между чем-то.

Просто чтобы быть ясным, независимо от ограничений на каникулы, я все еще хочу получить всех людей. Это мой текущий запрос HQL:

select distinct p 
from Person as p 
left join fetch p.vacations as v 
where v.startDate between '2011-07-01' and '2011-07-30'

Проблема в том, что он ограничивает возврат моих лиц только тем, у кого отпуск, который соблюдает условия ... Может кто-нибудь помочь, пожалуйста?

У меня нет проблем, если кто-то может сказать мне это в нативном SQL

ОБНОВЛЕНИЕ Решено в нативном SQL благодаря @Quasdunk:

SELECT * 
FROM person as p 
LEFT JOIN 
     (SELECT * FROM vacation
      WHERE startDate BETWEEN '2011-08-01' AND '2011-08-30') as v ON v.person_id = p.id

Моя новая проблема заключается в том, как преобразовать его в HQL-запрос, чтобы я мог получать отпуска для каждого человека и для отдельных лиц (условия остаются неизменными).

Ответы [ 4 ]

1 голос
/ 04 августа 2011

В нативном SQL это будет:

SELECT * 
FROM person 
LEFT JOIN (SELECT * 
           FROM vacations 
           WHERE startDate BETWEEN '2011-07-01' AND '2011-07-30')

непроверено, но вы поняли:)

0 голосов
/ 04 августа 2011

В простом (My) SQL это будет выглядеть так:

select distinct p.* from person p
left join vacations v on p.id = v.person_id 
where v.id is null or.v.start_date between '2011-07-01' and '2011-07-30'

В HQL это, вероятно, будет (не проверено)

select distinct p from Person as p 
left join fetch p.vacations as v 
where v.id is null or  v.startDate between '2011-07-01' and '2011-07-30'

или, может быть (я не совсем уверен, сработает ли это)

select distinct p from Person as p 
left join fetch p.vacations as v 
where v is null or v.startDate between '2011-07-01' and '2011-07-30'
0 голосов
/ 04 августа 2011

Вы можете использовать функции для достижения этой цели:

select p from Person p 
where p.vacations.size = 0 
or (minelement(p.vacations) > '2011-07-01' 
    and 
    maxelement(p.vacations) < '2011-07-30')

Эти даты могут фактически быть типом Date.В зависимости от типа.

Попробуйте

select p from Person p 
where p.vacations.size = 0 
or (p.vacations.startDate > '2011-07-01' 
    and 
    p.vacations.endDate < '2011-07-30')

Вы также должны взглянуть на здесь

0 голосов
/ 04 августа 2011

Попробуйте следующее,

select p.*, v.* from PERSON p LEFT JOIN VACATION v on (p.id = v.p_id) where v.startDate between '2011-07-21' and '2011-07-22'

Надеюсь, это работает для вас.

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