2010-01-15 82 views
4

我有一個從兩個jpa實體(繼承)生成的單個表。所以我們在數據庫表中生成一個DTYPE列,其實體名稱具有值。針對DTYPE的JPA查詢

如何寫一個jpa查詢來獲取任何給定實體的數據。即DTYPE ='A'?

我剛剛嘗試在jpa查詢中使用DTYPE,但如預期的那樣,出現「無法解析屬性」錯誤。請讓我知道如何編寫這個查詢。

注 - 我不想使用本機查詢。

更新:

我有A類和AA子延伸A. DTYPE有兩個值A和AA。

當我查詢A時,我得到所有A加AA實體。當我查詢A時如何排除AA?

+0

我得到了解決方案:) 我用「選擇*從A其中a.id不在(選擇aa.id從AA aa)」內轉換爲sql查詢選擇....不在(選擇ID從表t t其中t.DYPE ='AA') – 2010-01-15 12:21:04

回答

2

假設你有三個實體:

  • 黨(超)
  • 人(延伸黨)
  • 組織(延伸黨)

其中最後兩個是兩個實體您使用鑑別器列存儲,您的JPA-QL查詢應該如此簡單:

select p from Person p 

得到所有的人。 JPA足夠聰明地弄明白了。同樣,你可以這樣做:

select p from Party p 

並得到他們所有人。

+0

Cletus,當你查詢黨如何排除人? – 2010-01-15 11:45:12

+2

@ tom_987:您不查詢派對,您查詢個人或組織。 Party只是繼承類型的基類/通用類型。 – 2011-10-05 17:21:05

2

您可以在您的JPA查詢中使用實體名稱,將鑑別器列抽象出來。

假設你有兩個實體類SubClassASubClassB,這無論是從SuperClass繼承,那麼你可以爲這些entites的,像這樣的查詢:

FROM SubClassA WHERE [...] 

FROM SubClassB WHERE [...] 

如果您想查詢對於兩個實體,請使用

FROM SuperClass WHERE [...] 
+0

Henning能否請您閱讀我的更新並回復我的問題 – 2010-01-15 11:55:57

3

只需在父類中添加一個簡單字段dtype即可。 (可插入= false,可更新= false) private String dtype;

所以,你可以用它在你的JPQL查詢

1

另外的什麼@SCH職位中,如沒有直接爲我工作,使用的是Oracle,我得到一個異常說「D型「是一種保留的關鍵字。然後我做了

@DiscriminatorColumn(name = "myDType") 
class abstract AbstractClass{ 

@Column(insertable = false, updatable = false) 
private String myDType; 
[...] 

這工作對我很好,因爲這樣我可以動態改變我想用一個where條件而不是改變FROM語句來查詢類型。