Мы широко используем HQL-запрос HQL, и я думаю, что, наконец, существует такой хакерский способ:
Предполагая, что у нас изначально был запрос
i2.element.id = :someId
Затем решил расширить это так:
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
Но возникла проблема, когда мы хотим, чтобы он осуществлял поиск только на основе classType, поэтому оператор case:
(case when type(i)=Item then
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
else
i.element.id = :someId
end)
Выше не будет работать, вы можете сделать простую версию выше, выполнив:
(case when type(i)=Item then
i2.element.id
else
i.element.id
end)=:elementId
Но на самом деле это не делает то, что нам нужно, мы хотим, чтобы он выполнял точно вышеуказанный запрос, поэтому, зная, что вы можете назначить переменную в конце оператора case там, где бит HQL:
(
(
(case when
type(r)=Item then
i.element.id
else
i.element.id end) = :elementId
and
(case when
type(r)=Item then
i2.element.id
else
i.element.id end) = :elementId
)
or
(case when
type(r)=Item then
i2.element.id
else
i.element.id end) = :elementId
)
Мне удалось заставить запрос теперь работать на основе оператора case, конечно, он намного длиннее, но фактически делает то же самое, что и первый экземпляр