JPQL и внешнее соединение - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть проблема с этим простым левым соединением.

У меня есть две таблицы: Сотрудник и Отдел

Сотрудник имеет многозначную связь с Отделом:

public class Employee {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_EMPLOYEE")
    private Long id;

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

    @Column(name = "SURNAME")
    private String surname;

    @ManyToOne()    
    private Department department;

И отдел:

@Entity
@Table(name = "DEPARTMENT")
@SequenceGenerator(name = "SEQ_DEPARTMENT", sequenceName = "SEQ_DEPARTMENT", allocationSize = 1)
public class Department {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_DEPARTMENT")
    private Long id;

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

В дБ

SELECT * FROM EMPLOYEE;
ID      NAME    SURNAME     DEPARTMENT_ID  
1   Massimo Ugues   1
2   Mazi    Ugues   2

SELECT * FROM DEPARTMENT;
ID      ADDRESS     NAME  
1   Via Gaber   Le betulle

Итак, есть один Сотрудник, который не принадлежит ни одному Отделу.

Теперь мне нужнозагрузите Employee с идентификатором 2, а тот с DepartmentId = 2, которого нет на Db.

Итак, это запрос JPQL:

select e, department from Employee e left outer join e.department department where e.name = :name and department.id = :id

И это относительный sqlсгенерировано:

SELECT t0.ID, t0.NAME, t0.SURNAME, t0.DEPARTMENT_ID, t1.ID, t1.ADDRESS, t1.NAME FROM {oj EMPLOYEE t0 LEFT OUTER JOIN DEPARTMENT t1 ON (t1.ID = t0.DEPARTMENT_ID)} WHERE ((t0.NAME = ?) AND (t1.ID = ?))
    bind => [Mazi, 2]

Проблема не в соединении, а в t1.ID = ?.Это должно быть t0.ID =?где t0 - таблица сотрудников.

Есть идеи, как заставить ее работать?

С уважением.Massimo

1 Ответ

0 голосов
/ 28 ноября 2011

Проблема не в спящем режиме. Проблема в вашей базе данных. Если сотрудник не принадлежит ни к одному отделу, он должен иметь NULL в столбце department_id, а не какой-либо несуществующий идентификатор отдела. У вас должно быть ограничение внешнего ключа на employee.department_id, чтобы такие несоответствия никогда не возникали. Это C в кислоте.

Итак, мой совет: исправить данные:

update employee set department_id = null where department_id not in (select id from department)

Кроме того, обратите внимание, что выполнение левого объединения и принуждение отдела иметь определенный идентификатор аналогично внутреннему объединению.

...