2015-09-20 54 views
0

假設我想獲得ID低於10的MyEntity的所有行。此實體包含一個Another實體列表。我希望這個列表只能由listAnother的子集提取。該子集僅包含Another,其中包含的user是特定的子集。選擇包含在實體中的列表的子集

基本上在SQL它會是這樣:

SELECT * FROM myentity m 
LEFT JOIN another a 
ON m.idTable=a.my_entity 
AND a.user = "test1" 
WHERE m.idTable < 10; 

我沒但是管理這個查詢JPQL翻譯。

我的實體是這樣的:

@Entity 
public class MyEntity implements Serializable {  
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int idTable; 

    @OneToMany(mappedBy = "myEntity") 
    private List<Another> listAnother; 

} 

@Entity 
public class Another implements Serializable {  
    @Id 
    private int idAnother; 

    // bi-directional many-to-one association to Thethread 
    @ManyToOne(fetch = FetchType.LAZY) 
    private MyEntity myEntity; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private User user; 
} 

@Entity 
public class User implements Serializable { 

    @Id 
    private String username; 
} 

在JPA我可以這樣做:

SELECT m FROM MyEntity where m.idTable < 10; 

然後爲每個實體我從這個名單調用此獲得:

SELECT a FROM Another Where a.user.username=:'test' AND a.myEntity=:entity; 

但是我想t o在一個查詢中一次完成。我可以用標準來做到這一點嗎?我沒有花時間學習,但如果可能的話,我會。

回答

1

JPQL和Critaria API在您可以用它們表達的內容方面是相同的。 Criteria有可能使用JPQL,反之亦然。

隨着JPQL,您可以簡單地結合你的2個查詢到一個以這種方式:(。)

SELECT a FROM Another a Where a.user.username=:test AND a.myEntity.idTable < 10 

您可以使用點標記來加入多個實體的查詢,提供的關係是X-一對一。如果你有X對多的關係,你需要使用JPQL JOIN,這不是很複雜。與(左)例如JOIN:

SELECT m FROM MyEntity m LEFT JOIN m.listAnother a Where a.user.username=:test AND m.idTable < 10 

的結果當然是不相等的 - 在第一種情況下,你會得到另一個實體的服務,您可以通過獲得myEntity所。myEntity所,在第二種情況下,你會得到myEntity所,它們都具有至少一個另一個實體給予用戶

+0

等待我正在重讀你的答案,並在最後說「哪一個都至少有一個給定用戶的另一個實體」。我想要的是MyEntity有一個大小爲1或0的列表,其中包含大小爲1的另一個:具有給定用戶的另一個。 – Ced

+0

編輯我的評論*,我想我發現如何做到這一點。所以我會讓你在我確定的時候編輯你的評論,併發布如何和我會接受你的答案。 – Ced

+0

有了原生的JPA是不可能得到一個實體王氏過濾收集 - 您始終獲得所有相關實體在X一對多的映射。如果你想過濾,你需要發出另一個查詢,就像你在你的問題中寫的那樣。您希望使用特定於實現的API,但可能會導致意外的行爲。另請參見[這裏]對話(http://www.eclipse.org/forums/index.php/t/300191/) – OndrejM

0

在休眠中,您可以使用Filters和FilterJoinTable。 Here你可以閱讀如何做到這一點。類似的問題解決了here

+0

哦,我把冬眠的標籤列表中,但我的意思是把標準。我不使用休眠。我非常抱歉。儘管我會看你的領導。 – Ced

0

您需要擴展您應用的邏輯來檢查用戶名(a.user.username ='test'),該用戶名與用戶之間的多對一關係是通過將其級別設置爲myEntity然後使用它的一個一對多的關係,以及 -

SELECT m FROM MyEntity where m.idTable < 10 and (m.listAnother.user.username=:'test') 

連接條件「m.listAnother.myEntity =:實體」,現在就不會需要爲我們的查詢,我們從具體的開始myEntity,然後下移到listAnother.user.username。

我沒有表格定義來自己嘗試這個查詢,確切的SQL可能需要一些調整 - 但從邏輯上說,它應該像我上面顯示的方式一樣工作,也就是說,您以同樣的方式加入另一個用戶你可以通過遍歷子列表中的另一個來加入MyEntity。

+0

這是行不通的。如果用戶不在列表中,我希望在列表中只有另一個具有用戶'test'的實體(假設每個列表只有一個)或myentity的空列表。 – Ced

相關問題