JPA-аннотация @DiscriminatorValue для объекта root не возвращает ожидаемых результатов или возвращает все записи - PullRequest
1 голос
/ 06 января 2020

У меня есть следующие сущности:

@Table(name="Animal")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("Animal")
public class Animal{
// code brevity
}

@Entity
@Discriminatorvalue("Dog")
public class Dog extends Animal{
// code brevity
}

Поэтому, когда я запускаю запрос jpa entityManager.createQuery ("from Animal"). GetResultList () , он возвращает мне все записи в таблице Animal , где DTYPE in ('Animal', 'Dog') вместо , где DTYPE in ('Animal') . Как получить возвращенные записи , где DYTPE = 'Animal' * только 1011 *?

1 Ответ

0 голосов
/ 06 января 2020

Фильтр от Animal означает экземпляры типа Animal. Любой экземпляр типа Dog также является экземпляром типа Animal и также будет выбран. Это работает правильно. И если позже у вас будет больше подклассов и вы выберете из Animal , вы снова получите все экземпляров, включая подклассы.

Если вы хотите исключить экземпляры типа Dog , вы должны сделать это явно в своем запросе.

Я бы предложил изменить вашу модель и не использовать какой-либо дискриминатор для базового класса. Таким образом, вы избежите таких неверных ожиданий: ни один разработчик в вашей команде не будет ожидать, что выбор из Animal выберет только часть записей; все поймут, что select вернет все сущностей всех подклассов. Используйте значения дискриминатора только для подклассов.

...