2013-01-24 159 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」),.. ..需要在特定實體中指定 –