Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPQL和外部连接_Java_Jpql_Outer Join - Fatal编程技术网

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。