命名查询和继承

时间:2013-01-24 18:25:28

标签: java jpa

我对使用namedqueries和继承

有疑问

如果我有类似的构建:

                               User (abstract) not persisted
                                    ¦
                    __________________________________
                    ¦               ¦                ¦

                Customer         Manager        Administrator        

然后将它们放在一个表中(inheritancetype)

如果您使用Userrepository来检索它们,那么您可以使用namedqueries。为此,您需要在User实体中编写namedqueries。

是否可以使用父类中的namedqueries检索子类?

如果我选择继续使用inheritancetype = Table,那么我的namedqueries会不一样呢?

2 个答案:

答案 0 :(得分:2)

绝对。如果你说:

SELECT u FROM User u WHERE u.age >= 18

(假设ageUser的属性),查询将返回匹配给定条件的User的所有子类。结果将为List<User>,因此您必须向下转换为CustomerManagerAdministrator

继承策略在这里没有任何关系。如果您要求User,JPA实现将始终返回正确的子类。毕竟,User可以而且应该是abstract

答案 1 :(得分:1)

可以在持久性单元中的任何位置定义命名查询,并且不需要直接处理它们所定义的类,如果它们涉及用户,则将它们放在用户上是有意义的。至于继承,JPA要求任何用户用户选择用户&#34; type query return符合选择条件的用户。这包括客户,经理和任何被视为用户的子类,无论使用何种类型的继承。单表,连接,每个类的表 - 都需要返回子类。因此,需要注意避免由于不需要的继承而创建昂贵的查询。

JPA允许在JPQL中使用TYPE()函数进行限制,以便您可以在结果中包含或排除特定的类,JPA 2.1将包括TREAT以执行类似的功能。