У меня есть иерархия классов, отображаемых в спящий режим, которая выглядит примерно так:
@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 страниц для каждого подзапроса.)