이 간단한 왼쪽 조인으로이 문제가 있습니다.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은 직원 테이블입니다.
어떻게 만들 수 있습니까?
친절하게 제공합니다. 마시모
네, 그게 최선의 해결책이 될 것입니다. 그러나 나는 lagacy 데이터베이스를 가지고 있기 때문에 이와 같은 문제를 처리해야만합니다. 이름을 가진 직원을로드하고 부서 ID가 부적절한 departmentId를로드하는 방법이 필요합니다. DB에는 참조 무결성이 없습니다. 한 가지 해결책은 departmentId를 String 속성으로 처리하는 것입니다. 직원과 부서 간의 관계를 목표로 삼고 목표를 달성하기위한 또 다른 해결책이 있습니까? 친절합니다. Massimo –
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를 사용할 수 있습니다. 하지만 언젠가는이 무결성 결핍에 당신이 물릴 것이라고 생각합니다. –
나는 최대 절전 모드가 아닌 japana 링크로서 Eclipse 링크가있는 aganinst pure JPA를 코딩하고있다. –