2013-03-04 69 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')