我对使用namedqueries和继承
有疑问如果我有类似的构建:
User (abstract) not persisted
¦
__________________________________
¦ ¦ ¦
Customer Manager Administrator
然后将它们放在一个表中(inheritancetype)
如果您使用Userrepository来检索它们,那么您可以使用namedqueries。为此,您需要在User实体中编写namedqueries。
是否可以使用父类中的namedqueries检索子类?
如果我选择继续使用inheritancetype = Table,那么我的namedqueries会不一样呢?
答案 0 :(得分:2)
绝对。如果你说:
SELECT u FROM User u WHERE u.age >= 18
(假设age
是User
的属性),查询将返回匹配给定条件的User
的所有子类。结果将为List<User>
,因此您必须向下转换为Customer
,Manager
或Administrator
。
继承策略在这里没有任何关系。如果您要求User
,JPA实现将始终返回正确的子类。毕竟,User
可以而且应该是abstract
。
答案 1 :(得分:1)
可以在持久性单元中的任何位置定义命名查询,并且不需要直接处理它们所定义的类,如果它们涉及用户,则将它们放在用户上是有意义的。至于继承,JPA要求任何用户用户选择用户&#34; type query return符合选择条件的用户。这包括客户,经理和任何被视为用户的子类,无论使用何种类型的继承。单表,连接,每个类的表 - 都需要返回子类。因此,需要注意避免由于不需要的继承而创建昂贵的查询。
JPA允许在JPQL中使用TYPE()函数进行限制,以便您可以在结果中包含或排除特定的类,JPA 2.1将包括TREAT以执行类似的功能。