2011-11-28 1 views
0

이 간단한 왼쪽 조인으로이 문제가 있습니다.JPQL 및 외부 조인

나는 두 개의 테이블이 있습니다

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; 

그리고 부서 : 직원 및 부서를

직원은 대일 부서와 관련이있다 dB

@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 

그래서 어떤 부서에도 속하지 않는 직원이 한 명 있습니다.

이제 ID가 2 인 Employee를로드해야하는데, departmentId = 2 인 ID는 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은 직원 테이블입니다.

어떻게 만들 수 있습니까?

친절하게 제공합니다. 마시모

답변

0

문제는 최대 절전 모드가 아닙니다. 문제는 데이터베이스입니다. 직원이 어떤 부서에도 소속되어 있지 않은 경우 department_id 열에 NULL이 있어야하며 일부 부서가 아닌 부서 ID 여야합니다. 그러한 incoherences 결코 일어나지 않도록하려면 employee.department_id에 외래 키 제약 조건이 있어야합니다. 그것은 ACID의 C입니다.

그래서, 내 조언은 다음과 같습니다 데이터 수정 :

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

는 또한, 왼쪽을하고 가입하고 특정 ID를 가지고 부서를 강제주의하는 것은 내부 조인하고 동일합니다.

+0

네, 그게 최선의 해결책이 될 것입니다. 그러나 나는 lagacy 데이터베이스를 가지고 있기 때문에 이와 같은 문제를 처리해야만합니다. 이름을 가진 직원을로드하고 부서 ID가 부적절한 departmentId를로드하는 방법이 필요합니다. DB에는 참조 무결성이 없습니다. 한 가지 해결책은 departmentId를 String 속성으로 처리하는 것입니다. 직원과 부서 간의 관계를 목표로 삼고 목표를 달성하기위한 또 다른 해결책이 있습니까? 친절합니다. Massimo –

+0

NotFound 주석을 사용할 수 있습니다. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e7744를 참조하십시오. 그러나 특정 부서가있는 직원을 요구하기 때문에 쿼리는 직원을로드하지 않습니다. e.name = : name 및 e.department.id = : id에서 Employee의 select e를 사용할 수 있습니다. 하지만 언젠가는이 무결성 결핍에 당신이 물릴 것이라고 생각합니다. –

+0

나는 최대 절전 모드가 아닌 japana 링크로서 Eclipse 링크가있는 aganinst pure JPA를 코딩하고있다. –