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

Kim*_*imi 12 java jpa jpql jpa-2.0

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

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

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

[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 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));
Run Code Online (Sandbox Code Playgroud)

编辑:

我刚刚在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));
Run Code Online (Sandbox Code Playgroud)