如何在JPA 2.0中创建类似“实例”的查询?

2022-09-04 05:55:34

假设我们有一个抽象的@Entity Animal,以及几个扩展 Animal 的实体类,包括 Dog、Cat、Monkey 和 Bat。

如何根据扩展实体的类筛选结果?

示例:用户可以在其中选择要检索的实体的复选框。

[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat

现在,我想使用类中定义的(命名)查询检索实体。我可以在查询中放入哪些类型的查询参数,以便仅返回 Cat 和 Monkey 对象?Animal


答案 1

我不确定JPA是否支持它,但是在Hibernate中执行此操作的方法,无论继承策略如何,因此即使您没有鉴别器(或没有将其映射为属性)也是使用隐式属性:class

String jpql = "select a from Animal a where a.class in (:classes)";
Query q = em.createQuery(jpql).setParameter("classes", 
                                            Arrays.asList(Cat.class, Monkey.class));

编辑:

我刚刚发现在JPA2中使用TYPE运算符是可能的:

String jpql = "SELECT a FROM Animal a WHERE TYPE(a) IN :classes";
Query q = em.createQuery(jpql).setParameter("classes", 
                                            Arrays.asList(Cat.class, Monkey.class));

答案 2

可以使用离散器列和值仅搜索给定类型的某些子类型。默认情况下,鉴别器列的名称在 JPA 中为 DTYPE,类型为 String,值是类的名称。但是,您可以通过添加类级别批注(对于鉴别器列的名称和类型)和(对于特定类的特定disriminator值)来覆盖它。然后,您可以在 yoru JPQL 查询的 WHERE 子句中使用它来仅获取某些子类型,例如:@DiscriminatorColumn(name="KIND", discriminatorType=DiscriminatorType.INTEGER)@DiscriminatorValue("1")WHERE DTYPE="Dog" OR DTYPE="Cat"


推荐