2015-12-31 3 views
5

У меня есть 2 класса java, Relation и Person, которые оба присутствуют в моей базе данных.Аннотации для объединения столбцов с условием ИЛИ вместо условия И

лицо:

@Entity 
@Table(name = "persons") 
public class Person { 
    @Id 
    @Column 
    private int id; 

    @Column 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name = "slave_id", referencedColumnName="id"), 
     @JoinColumn(name = "master_id", referencedColumnName="id") 
    }) 
    private List<Relation> relations; 

    //Getters and setters 
} 

отношений:

@Entity 
@Table(name = "relations") 
public class Relation { 
    @Id 
    @Column 
    private int id; 

    @Column 
    private int child_id; 

    @Column 
    private int parent_id; 

    @Column 
    private String type; 

    //Getters and setters 
} 

Каждый человек имеет список отношений (или нет), то соотношение должно быть добавлено к списку, когда child_id или parent_id из отношение равно id человека.

TL; DR: При relation.child_id OR relation.parent_id = person.id => добавить отношение к списку отношений к человеку

Проблема я столкнулся в том, что эта аннотация:

@JoinColumns({ 
      @JoinColumn(name = "child_id", referencedColumnName="id"), 
      @JoinColumn(name = "parent_id", referencedColumnName="id") 
     }) 

создает следующий SQL (только необходимые часть):

relations relations6_ 
      on this_.id=relations6_.slave_id 
      and this_.id=relations6_.master_id 

Как правильно аннотаций в Java Hibernate, чтобы генерировать оператор SQL, говоря ИЛИ вместо И

ответ

3

Некоторые из вариантов, которые вы могли бы использовать:

  1. представления базы данных. Создайте представление, которое выполняет пользовательское соединение для вас, и сопоставьте объект с представлением.
  2. Join formula. Мне удалось заставить их работать только со многими ассоциациями. Тем не менее, вы можете сделать связь двунаправленной и применить формулу в объекте Relation.
  3. @Subselect. Это своего рода вид спящего режима, подходит, если вы не можете позволить себе создать реальный вид базы данных или изменить схему db, чтобы лучше соответствовать структуре модели сущности.

This и this ответ также может быть полезным.

Кроме того, вы всегда можете использовать две отдельные ассоциации для рабов и господ:

public class Person { 
    @OneToMany 
    @JoinColumn(name = "slave_id"), 
    private List<Relation> slaves; 

    @OneToMany 
    @JoinColumn(name = "master_id"), 
    private List<Relation> masters; 

    public List<Relation> getRelations() { 
     List<Relation> result = new ArrayList<>(slaves); 
     result.addAll(masters); 
     return result; 
    } 
} 

Однако, имейте в виду, что присоединение их все в одном запросе требует полного декартово произведение между хозяевами и рабами.

+0

Оба, входящие в формулу, и Subselect кажутся перспективными. Но мне больше не нравится писать SQL в этих аннотациях, поэтому я продолжаю искать ответ, который подходит для этого вопроса. – STheFox

+0

@STheFox В этом случае, пожалуйста, см. Мой обновленный ответ. Во всяком случае, нет никаких аннотаций, специально разработанных для вашего дела; вам придется использовать некоторые обходные пути. –

+0

Да, мне удалось получить 2 списка, но я искал для написания лучшего и более чистого кода. Мой код был похож на ваш код. Разве нет аннотации, чтобы сделать это сразу? – STheFox

-2

Вы можете использовать @FilterDef и @Filter аннотаций.

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