4

我对命名查询和继承的使用有疑问

如果我有这样的构建:

                               User (abstract) not persisted
                                    ¦
                    __________________________________
                    ¦               ¦                ¦

                Customer         Manager        Administrator        

例如,您将它们放在一个表中(继承类型)

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

是否可以使用父类中的命名查询检索子类?

如果我选择按类使用inheritancetype = Table,那我的namedqueries 就不能一样了呢?

4

2 回答 2

3

绝对地。如果你说:

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

(假设age是 的一个属性User)查询将返回User匹配给定条件的所有子类。结果将是List<User>这样,您将不得不向下转换为Customer,ManagerAdministrator

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

于 2013-01-24T18:33:57.120 回答
1

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

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

于 2013-01-24T18:35:02.473 回答