Моя ситуация такова:
У нас есть суперкласс "MyAbstractEntity"
@Entity
@Table(name = "MyTable")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("FOO")
public abstract class MyAbstractEntity implements Comparable<MyAbstractEntity> {
Этот класс, в свою очередь, имеет довольно много подклассов, выглядящих так:
@Entity
@DiscriminatorValue("BAR")
public class MyEntity extends MyAbstractEntity implements MyInterface {
Около половины подклассов реализуют "MyInterface".
У меня есть Критерии, в которых мне интересно получать только объекты из класса, реализующего этот интерфейс.
Когда я определяю свои критерии следующим образом:
Criteria criteria = getSession().createCriteria(MyInterface.class)
Hibernate поворачивается и генерирует один DB-вызов для каждой реализации интерфейса, и DB-парни сходят с ума. Я наполовину ожидал, что Hibernate переведет это во что-то, использующее предложение «in» в столбце DISCRIMINATOR вместо создания отдельного вызова для каждой реализации.
Я пытался найти это, но, к сожалению, мои результаты загрязняются тем фактом, что мой запрос содержит «спящий режим», «критерии» и «интерфейс», и я постоянно сталкиваюсь со страницами, которые либо объясняют API, либо демонстрируют основные примеры.
Мне известно, что я мог бы создать Критерии для "MyAbstractEntity" вместо "MyInterface" и удалить нежелательные результаты, но я хочу, чтобы эта фильтрация происходила в базе данных.
Нет ли способа сообщить Hibernate, что я хочу всего за один вызов db?