2013-03-04 153 views
0

選擇父我有以下表格:休眠:與兒童狀況

HEADER

--------------------------------- 
ID    |  STATUS 
--------------------------------- 
1    |  A 
--------------------------------- 
2    |  B 
--------------------------------- 

DATA

-------------------------------------------------- 
ID   | HEADER_ID | DKEY | DVALUE 
-------------------------------------------------- 
1   |  1  | Age  | 90 
-------------------------------------------------- 
2   |  1  | Gender | M 
-------------------------------------------------- 
3   |  1  | Score | 1000 
-------------------------------------------------- 
1   |  2  | Age  | 8 
-------------------------------------------------- 
2   |  2  | Gender | M 
-------------------------------------------------- 
3   |  2  | Score | 0 
-------------------------------------------------- 

我的JPA類:

**@Entity 
@Table (name="HEADER") 
public class Header { 
    @Id 
    @GeneratedValue 
    private int id; 

    @Column (name="STATUS") 
    private String status; 

    @OneToMany (cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="header") 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<Data> dataList; 

    --- getters and Setters --- 
} 


@Entity 
@Table (name="DATA") 
publi class Data { 
    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "HEADER_ID", nullable = false) 
    private Header header; 

    @Column (name="DKEY") 
    private String key; 

    @Column (name="DVALUE") 
    private String value; 
}** 

現在,我的問題是,我想使用休眠選擇一個數據標題的「年齡」等於「90」和「性別」等於「M」。 我嘗試瞭如下的方法:

選擇從首標h不同ħ左連接h.dataList DL其中(dl.key = '年齡' 和dl.value = '90')和(dl.key =「性別'和dl.value ='M')

由於條件「(dl.key ='Age'和dl.value = '90')和(dl.key ='Gender'和dl.value ='M')「在一個」DATA「記錄中執行,該記錄總是會產生錯誤。

如果我把或者(「dl.key ='Age'和dl.value ='90')或者(dl.key ='Gender'和dl.value ='M')」結果是錯誤的因爲我想獲得那些數據滿足年齡和性別條件的標題。

因爲這個問題,我有幾個小時的頭痛,我已經沒有辦法解決問題了。希望有人能指出我正確的方向/解決方案。

非常感謝喲。

回答

0

您可以嘗試重寫它這樣:

select distinct h from Header as h 
where h.id in 
    (select dl.header.id from Data as dl where dl.key = 'Age' and dl.value = '90') 
and h.id in 
    (select dl.header.id from Data as dl where dl.key = 'Gender' and dl.value = 'M')