2015-03-02 4 views
4

Я пытаюсь присоединиться к различным объектам из одной таблицы, используя постоянное значение в заявлении объединения. В SQL, я хотел бы сделать что-то вроде этого ...JPA/Hibernate Join On Постоянное значение

SELECT * 
FROM owner o 
JOIN types t on t.owner_id = o.id AND t.type = 'A' 
--        ^^^^^^^^^^^^^^^^ THIS IS WHAT I AM TRYING TO REPLICATE 

В Java + JPA/Hibernate, я пытаюсь сделать что-то вроде этого ...

@Entity 
@Table(name = "OWNER") 
public class Owner { 

    @Id 
    @Column(name="ID") 
    private Long id 

    @OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumns({ 
     @JoinColumn(name = "ID", referencedColumnName = "ID"), 
     @JoinColumn(constantValue = "A", referencedColumnName="type")}) 
    //    ^^^^^^^^^^^^^^^^^^^ I AM LOOKING FOR SOMETHING THAT DOES THIS. 
    //         constantValue IS NOT A VALID ARGUMENT HERE. 
    private TypeA inspectionSnapshot; 

    @OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumns({ 
     @JoinColumn(name = "ID", referencedColumnName = "ID"), 
     @JoinColumn(constantValue = "B", referencedColumnName="type")}) 
    private TypeB inspectionSnapshot; 

    /* Getters & Setters ... */ 
} 

@Entity 
@Table(name = "TYPES") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) 
public abstract class BaseType { 

    @Id 
    @OneToOne 
    @JoinColumn(name = "OWNER_ID", referencedColumnName="ID") 
    private Owner id; 

    @Id 
    @Column(name = "TYPE") 
    private char type 

    /* Getters & Setters ... */ 
} 

@Entity 
@DiscriminatorValue("A") 
public class TypeA extends BaseType { 
    /* All functionality in BaseType */ 
} 

@Entity 
@DiscriminatorValue("B") 
public class TypeA extends BaseType { 
    /* All functionality in BaseType */ 
} 

Заранее спасибо!

ответ

2

Вы смотрите на нестандартные соединения. Вот документация для лечения такого случая:

http://docs.oracle.com/cd/E13189_01/kodo/docs40/full/html/ref_guide_mapping_notes_nonstdjoins.html

Надеется, что это помогает!

+0

Смешная история ... мы закончили ремоделирование данных, чтобы каждый из подтипов имел уникальный порядковый номер для первичного ключа. Но я попробовал ваше решение, и он полностью сработал! Спасибо за помощь! – EvilJoe

3

Если вы не возражаете против использования Hibernate-специфических аннотаций вы можете попробовать с @WhereJoinTable аннотаций, например:

@OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name = "ID", referencedColumnName = "ID") 
@WhereJoinTable(clause = "TYPE = 'A'") 
private TypeA inspectionSnapshot; 

Обратите внимание, что атрибут clause должен содержать SQL, не JPQL, так что вы должны использовать имя столбца базы данных вместо имени поля сущности JPA.

Смежные вопросы