2013-03-04 2 views
0

У меня есть следующие таблицы:Hibernate: Выберите Родитель с детьми Условия

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», а «Пол» равен «М» с использованием спящего режима. Я попытался ниже подход:

выбрать отличный час из заголовка ч соединения слева h.dataList дл, где (dl.key = «Возраст» и dl.value = «90») и (dl.key = «Пол 'и dl.value =' M ')

Это не возвращает мне ничего, потому что условие «(dl.key =' Age 'и dl.value =' 90 ') и (dl.key =' Gender 'и dl.value = 'M') "выполняется в одной записи" DATA ", которая всегда будет давать false.

Если я положил or, "(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') 
Смежные вопросы