Эмуляция LEFT JOIN в Spring Entity - PullRequest
0 голосов
/ 06 августа 2020

По сути, то, что я пытаюсь сделать, это ...

SELECT a.*, b.description, c.description FROM a 
LEFT JOIN b ON b.code = a.b_code
LEFT JOIN c ON c.code = a.c_code

Я хотел бы полностью отобразить это, используя структуру Spring / JPA. Я поигрался с @SecondaryTable только для того, чтобы узнать, что он не будет работать в случае th ie, и я получал ряд ошибок при попытке сопоставить его с помощью @OneToOne или @JoinColumn. Вот мои текущие классы сущностей ...

@Entity
@Table(name = "a")
public class a {
    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "b_code")
    private String bCode;

    //I'd like to have b.description here

    @Column(name = "c_code")
    private String cCode;

    //I'd like to have c.description here
}

@Entity
@Table(name = "b")
public class b {
    @Column(name = "code")
    private String code;

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

@Entity
@Table(name = "c")
public class c {
    @Column(name = "code")
    private String code;

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

1 Ответ

0 голосов
/ 13 августа 2020

Вам необходимо использовать @JoinColumn с referencedColumnName, как показано ниже.

@Entity
@Table(name = "a")
public class a {
    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "b_code")
    private String bCode;

    //I'd like to have b.description here

    @Column(name = "c_code")
    private String cCode;

    //I'd like to have c.description here
    
    @OneToOne // this should be based on your joining
    @JoinColumn(name = "b_code", referencedColumnName = "code", insertable = false, updatable = false)
    B b;
    
    @OneToOne// this should be based on your joining
    @JoinColumn(name = "c_code", referencedColumnName = "code", insertable = false, updatable = false)
    C c;
}

@Entity
@Table(name = "b")
public class B {
    @Column(name = "code")
    private String code;

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

@Entity
@Table(name = "c")
public class C {
    @Column(name = "code")
    private String code;

    @Column(name = "description")
    private String description;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...