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

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

如何根据扩展实体的类过滤结果?

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

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

现在我想检索具有Animal类中定义的(Named)查询的实体。 我可以在查询中放入哪种查询参数,以便只返回Cat和Monkey对象?

我并不完全确定它是由JPA支持的,但是在Hibernate中这样做的方式,无论inheritance策略如何,因此即使你没有鉴别器(或者没有将它作为属性映射)也是使用隐式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)); 

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