java 如何在 JPA 2.0 中创建类似“instance of”的查询?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7807608/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to create an 'instance of' -like query in JPA 2.0?
提问by Kimi
Say we've got an abstract @Entity Animal, and several entity classes that extend Animal, including Dog, Cat, Monkey and Bat.
假设我们有一个抽象的@Entity Animal,以及几个扩展 Animal 的实体类,包括 Dog、Cat、Monkey 和 Bat。
How can I filter the results based on the extending entity's class?
如何根据扩展实体的类过滤结果?
Example: There are checkboxes where the user can select which entities to retrieve.
示例:用户可以在复选框中选择要检索的实体。
[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat
Now I want to retrieve the entities with a (Named)Query defined in the Animal
class. What kind of query parameters can I put into the query so that only the Cat and Monkey objects will be returned?
现在我想用Animal
类中定义的(命名)查询检索实体。我可以在查询中放入什么样的查询参数,以便只返回 Cat 和 Monkey 对象?
回答by JB Nizet
I'm not absolutely sure it's supported by JPA, but the way to do it in Hibernate, regardless of the inheritance strategy, and thus even if you don't have a discriminator (or didn't map it as a property) is to use the implicit class
property :
我不确定它是否受 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));
EDIT :
编辑 :
I just found it's possible in JPA2 using the TYPE operator :
我刚刚发现在 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));
回答by Shivan Dragon
You can use the discrimnator column and value to only search for certain subtypes of a given type. By default the discriminator column's name is DTYPE in JPA,the type is String and the value is the name of the class. You can however override this by adding the class level annotation @DiscriminatorColumn(name="KIND", discriminatorType=DiscriminatorType.INTEGER)
(for the discriminator column's name and type) and @DiscriminatorValue("1")
(for the specific discrimiminator value for a certain class). You can then use this in the WHERE clause of yoru JPQL query to only fetch certain subtypes, like: WHERE DTYPE="Dog" OR DTYPE="Cat"
您可以使用鉴别器列和值来仅搜索给定类型的某些子类型。默认情况下,鉴别器列的名称是 JPA 中的 DTYPE,类型是 String,值是类的名称。但是,您可以通过添加类级别注释@DiscriminatorColumn(name="KIND", discriminatorType=DiscriminatorType.INTEGER)
(对于鉴别器列的名称和类型)和@DiscriminatorValue("1")
(对于某个类的特定鉴别器值)来覆盖它。然后,您可以在 yoru JPQL 查询的 WHERE 子句中使用它来仅获取某些子类型,例如:WHERE DTYPE="Dog" OR DTYPE="Cat"