0

次のテーブルがあります。

ヘッダ

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

データ

--------------------------------------------------
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 を選択 左結合 h.dataList dl where (dl.key = 'Age' and dl.value = '90') and (dl.key = 'Gender' and dl.value = 'M')

条件 "(dl.key = 'Age' and dl.value = '90') and (dl.key = 'Gender' and dl.value = 'M')" が 1 つの "DATA " 常に false になるレコード。

または、「(dl.key = 'Age' and dl.value = '90') or (dl.key = 'Gender' and dl.value = 'M')」を入力した場合、結果は間違っています。データが Age および Gender 条件を満たすヘッダーを取得します。

この問題のために何時間も頭が痛くなり、もう試す解決策がありません。誰かが正しい方向/解決策を教えてくれることを願っています。

ありがとうございます。

4

1 に答える 1

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')
于 2013-03-04T18:28:26.733 に答える