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

时间:2011-10-18 13:02:19

标签: java jpa jpa-2.0 jpql

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

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

实施例: 有复选框,用户可以选择要检索的实体。

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

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

2 个答案:

答案 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"