Java JPQL和外部连接
我对这个简单的左连接有这个问题 我有两张桌子: 员工和部门 员工与部门有多对一关联:Java JPQL和外部连接,java,jpql,outer-join,Java,Jpql,Outer Join,我对这个简单的左连接有这个问题 我有两张桌子: 员工和部门 员工与部门有多对一关联: public class Employee { @Id @Column(name = "ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_EMPLOYEE") private Long id; @Column(name = "NAME") private Strin
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;
及部门:
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
因此,有一名员工不属于任何部门
现在我需要加载id为2的员工,即在Db中不存在的部门id为2的员工
这就是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是employee表
你知道怎么做吗
亲切的问候。
Massimo问题不在于休眠。问题是你的数据库。如果员工不属于任何部门,则在
department\u id
列中应该有NULL
,而不是一些不存在的部门id。您应该对employee.department\u id
设置外键约束,以确保不会发生这种不一致。这是酸中的C
因此,我的建议是:修复数据:
update employee set department_id = null where department_id not in (select id from department)
另外,请注意,执行左连接并强制部门具有特定ID与执行内部连接相同 是的,那将是最好的解决办法。但由于我有一个lagacy数据库,所以我必须处理这样的问题,我需要某种方法来按姓名和departmentId加载一个可能不一致的departmentId值的员工。在DB上,我没有引用完整性。一种解决方案是将departmentId作为字符串属性处理。是否有另一种解决方案来维持员工和部门之间的关联,并实现目标?亲切的问候。Massimo您可以使用NotFound注释。看见但是,您的查询不会加载员工,因为它要求有特定部门的员工。您可以使用select e from Employee,其中e.name=:name和e.department.id=:id。但我认为您将在一段时间后被这种缺乏完整性的情况所困扰。我正在使用eclipse链接作为JPA提供者而不是hibernate编写纯JPA。