Java 根实体上的JPA annotation@DiscriminatorValue不返回预期结果或返回所有记录

Java 根实体上的JPA annotation@DiscriminatorValue不返回预期结果或返回所有记录,java,jpa,jakarta-ee,annotations,Java,Jpa,Jakarta Ee,Annotations,我有以下实体: @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 } 因

我有以下实体:

@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'?

从动物中筛选表示类型为Animal的实例。狗型的任何实例也是动物型的实例,也将被选中。这是正确的。如果您以后有更多的子类并从Animal中选择,您将再次获得包括子类在内的所有实例

如果要排除Dog类型的实例,应该在查询中显式地这样做

我建议您更改模型,不要对基类使用任何鉴别器。因此,您将避免这种错误的期望:您团队中的任何开发人员都不会期望从动物中选择只选择部分记录;每个人都会理解select将返回所有子类的所有实体。仅对子类使用鉴别器值。

从动物中筛选表示动物类型的实例。狗型的任何实例也是动物型的实例,也将被选中。这是正确的。如果您以后有更多的子类并从Animal中选择,您将再次获得包括子类在内的所有实例

如果要排除Dog类型的实例,应该在查询中显式地这样做


我建议您更改模型,不要对基类使用任何鉴别器。因此,您将避免这种错误的期望:您团队中的任何开发人员都不会期望从动物中选择只选择部分记录;每个人都会理解select将返回所有子类的所有实体。仅对子类使用鉴别器值。

显示用于获取结果的代码。@dassum我已经在问题中提到过,我正在使用entityManager.createQuery(“来自动物”).getResultList()获取结果。显示用于获取结果的代码。@dassum我已经提到过这一点,我正在使用entityManager.createQuery(“来自动物”).getResultList()获取结果。因此,如果我更改模型,那么我不希望团队中的任何人只插入/更新/选择动物。所以你建议,我将类Animal作为抽象类,并创建另一个子类GenericAnimal(动物的子类),与Dog并行?你现在就可以插入和更新了。但是在select中,必须显式排除其他子类,这将使查询变得过于复杂。是的,最好创建另一个子类。但我建议考虑其他名字。通用的发音和动物很相似,可以预期它是狗的一个基本类。像Undefinedinal或OtherAnimal这样的名称会更好,因为误解其含义的机会更少。因此,如果我更改模型,那么我不希望团队中的任何人只插入/更新/选择动物。所以你建议,我将类Animal作为抽象类,并创建另一个子类GenericAnimal(动物的子类),与Dog并行?你现在就可以插入和更新了。但是在select中,必须显式排除其他子类,这将使查询变得过于复杂。是的,最好创建另一个子类。但我建议考虑其他名字。通用的发音和动物很相似,可以预期它是狗的一个基本类。像UndefinedAnimal或OtherAnimal这样的名称会更好,因为误解其含义的机会更少。