假设我们有一个抽象的@Entity Animal,以及几个扩展Animal的实体类,包括Dog,Cat,Monkey和Bat。
如何根据扩展实体的类过滤结果?
实施例: 有复选框,用户可以选择要检索的实体。
[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat
现在我想检索具有Animal
类中定义的(命名)查询的实体。我可以在查询中放入哪种查询参数,以便只返回Cat和Monkey对象?
答案 0 :(得分:31)
我不完全确定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));
答案 1 :(得分:4)
您可以使用discriminimnator列和值仅搜索给定类型的某些子类型。默认情况下,鉴别器列的名称在JPA中是DTYPE,类型是String,值是类的名称。但是,您可以通过添加类级别注释@DiscriminatorColumn(name="KIND", discriminatorType=DiscriminatorType.INTEGER)
(用于鉴别器列的名称和类型)和@DiscriminatorValue("1")
(用于特定类的特定判别符值)来覆盖此值。然后,您可以在yoru JPQL查询的WHERE子句中使用它来仅获取某些子类型,例如:WHERE DTYPE="Dog" OR DTYPE="Cat"