2016-11-21 1 views
0

У меня есть следующий случай, когда у меня есть два класса/таблицы:Как указать фиксированный параметр для сопоставления соединения в спящем режиме?

public class Parent { 
    @Id 
    @Column(name="parent_id") 
    private Integer parentId; 

    @ManyToOne 
    @JoinColumn(name="child_id") //Notice here that i only specified one of the two id columns of the Child class 
    private Child child; 
    ... 
} 

public class Child { 
    @Id 
    @Column(name="child_id") 
    private Integer childId; 

    @Id 
    @Column(name="alive") 
    private Boolean alive; 

    @Column(name="name") 
    private String name; 
} 

Как вы можете видеть, child имеет два первичных ключей, что означает, что я могу иметь такую ​​же child_id в два ряда, один с alive=true и другой с alive=false, но я не атрибут alive на родителя:

PARENT TABLE 
parent_id | child_id 
-------------------- 
500  | 1 

CHILD TABLE 
child_id | alive | name 
-------------------------- 
1  | TRUE | DONALD 
1  | FALSE | HILLARY 

Я хочу гибернации для создания объединения пункт вставки атрибута alive, только тогда, когда alive=true, для EXA mple:

select * from Parent inner join Child on Child.child_id=Parent.child_id and Child.alive=true 

Есть ли способ сделать это, поэтому, когда я выполнить запрос как select p from Parent p он выполняет запрос, как ожидалось?

+0

Что вы имеете в виду 'вставив живой атрибут, только при жизни = true'? Разве «живое» не заполняется уже при поиске «alive = true»? –

+0

Что я имею в виду, если я запускаю запрос HQL, например 'select p from Parent p', sql, сгенерированный hibernate, не будет включать атрибут' alive' в разделе join (как и должно быть, потому что я не включил отображение атрибута 'alive', когда я задал' @ JoinColumn' в классе 'Parent'), например:' ... from Parent p internal join Child c on c.child_id = p.child_id'. Я хочу, чтобы спящий режим сгенерировал SQL-запрос с помощью 'alive = true' в разделе соединения. –

+1

Для класса родителя вы можете использовать @JoinColumnOrFormula (formula = @ JoinFormula (value = "(SELECT a.id FROM Child c WHERE c.childd_id = child_id и alive = true)", referendedColumnName = "child_id") – StanislavL

ответ

1

Для класса Parent можно использовать

@JoinColumnOrFormula([email protected](value="(SELECT a.id 
                FROM Child c 
                WHERE c.child_id=child_id 
                and alive=true)", 
    referencedColumnName="child_id") 

Добавлено правильный комментарий как ответ