2013-01-24 58 views
4

我有一个关于使用namedqueries和继承Namedqueries和继承

的问题,如果我有一个构建,如:

       User (abstract) not persisted 
            ¦ 
        __________________________________ 
        ¦    ¦    ¦ 

       Customer   Manager  Administrator   

而你将它们例如在一个表(inheritancetype)

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

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

如果我选择继承类型=表按类,那么我的namedqueries不能是相同的?

回答

2

绝对。如果你说:

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

(假设ageUser属性)查询将返回的User匹配给定标准的所有子类。结果将是List<User>,因此您必须下调至CustomerManagerAdministrator

继承策略在这里没有任何事情要做。如果您要求User,则JPA实现将始终返回适当的子类。毕竟,User可以也应该是abstract

+0

好的,你可以使用dicriminator来查看什么类是从哪个类投射到正确的类? –

+0

@DarthBlueRay:你可以。 'instanceof'或[tag:visitor]模式是替代方案。 –

+0

好的,谢谢,还会看看访问者模式 –

0

命名查询可以在持久化单元中的任意位置定义,并且不需要直接处理它们定义的类,只要它们涉及用户,就让它们在用户上是有意义的。至于继承,JPA要求任何“从用户用户中选择用户”类型查询返回符合选择标准的用户。这包括客户,经理和任何被认为是用户的子类,而不管所用的继承类型如何。单个表格,连接,每个表格的表格 - 全部需要返回子类别。因此需要注意避免由于不必要的继承而造成昂贵的查询。

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

+0

我总是相信namedqueries:@NamedQueries({name =“User.findAll”, query =“SELECT u FROM User u”),.. ..需要在特定实体中指定 –