полиморфные HQL-запросы с условиями на свойства конкретного класса;это можно сделать? - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть иерархия классов, отображаемых в спящий режим, которая выглядит примерно так:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Item { @ManyToOne Common common; ... }

@Entity
public class AbcItem extends Item { @ManyToOne Abc abc; ... }

@Entity
public class XyzItem extends Item { @ManyToOne Xyz xyz; ... }

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

Мне хотелось бы иметь возможность запрашивать с помощью HQL список элементов смешанного конкретного класса, но с предложением where, которое, в зависимости от конкретного класса, накладывает условия на необычные свойства.Что-то вроде «получить все Item si, у которых i.common = 7, но если они AbcItem s, они должны иметь abc = 5».

Все запросы легко можно запросить с помощью from Itemи я знаю, что могу получить определенный класс с .class.Но я не могу найти способ доступа к необычным свойствам или ассоциациям.Попытка from Item i where (i.class = AbcItem and i.abc = 5) or (i.class = XyzItem and i.xyz = 7) заставляет Hibernate жаловаться, что Item не имеет abc и xyz, что верно.По сути, кажется, что HQL имеет instanceof, но не имеет приведение.

Я что-то упустил?

(Примечания: я пытаюсь сделать это на HQL - или даже с запросами Criteria, если это возможно), а не на собственном SQL, чтобы оставаться несколько независимым от конкретной базы данныхЯ знаю, как сделать это с родным SQL, так что не беспокойтесь.

Кроме того, мне нужно сделать это с одним запросом. Я знаю, что могу делать отдельные запросыдля каждого класса и объединить результаты. Проблема в том, что приложению необходимо разбивать на страницы «объединенные» результаты, упорядоченные по общему свойству. Выполнение этого с отдельными запросами будет означать загрузку большого количества ненужных элементов, объединение списков, сортировкузатем отбросьте большинство из них. Для лучшего алгоритма, который я смог выяснить, для страницы N требуется загрузка первых N страниц для каждого подзапроса.)

1 Ответ

3 голосов
/ 14 декабря 2011

Если «id» является первичным ключом:

from Item i
where (
   i.id in (select i2.id from AbcItem i2 where i2.abc = 5)
   or i.id in (select id2.id from XyzItem i2 where i2.xyz = 7)
   )
and ...
order by ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...