JPA Left Join IS NULL条件不起作用

震级

我在MySQL上有User和Employee表,并且User表中有employeeId作为外键。

现在我需要找没有用户的员工。

我在MySQL Workbench中编写此SQL,这完全符合我的需要:

SELECT * FROM HUMANRESOURCE.EMPLOYEE E LEFT JOIN AUTHORIZE.USER U 
                                       ON U.EMPLOYEEOBJID = E.OBJID  
                                       WHERE U.EMPLOYEEOBJID is NULL;

但是,当我尝试将此SQL实现为JPA查询时,它不返回任何内容。这是JPA查询:

Query query = em.createQuery("SELECT e FROM Employee e LEFT JOIN User u 
                                        WHERE u.employee.objid = e.objid 
                                        AND u.employee IS NULL");

这是我用来获取具有用户的雇员的真正有效的JPA查询:

Query query = em.createQuery("SELECT e FROM Employee e INNER JOIN User u 
                                       WHERE u.employee.objid = e.objid");

我在这里做错了什么?

实体类更新:

Base.java

package com.kadir.entity;

import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.Date;

import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;


@Cacheable
@MappedSuperclass
public abstract class Base {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OBJID")
    private BigInteger objid;

    @Column(name = "CREATEDBY")
    private String createdby;

    @Column(name = "CREATEDDATE")
    private Timestamp createddate;

    @Version
    @Column(name = "ROWVERSION")
    private Integer rowversion;

    @Column(name = "UPDATEDBY")
    private String updatedby;

    @Column(name = "UPDATEDDATE")
    private Timestamp updateddate;

    @Column(name = "ARCHIVED", columnDefinition = "int default 0")
    private int archived;

    public BigInteger getObjid() {
        return this.objid;
    }

    public void setObjid(BigInteger objid) {
        this.objid = objid;
    }

    public String getCreatedby() {
        return this.createdby;
    }

    public void setCreatedby(String createdby) {
        this.createdby = createdby;
    }

    public Date getCreateddate() {
        return this.createddate;
    }

    public void setCreateddate(Timestamp createddate) {
        this.createddate = createddate;
    }

    public Integer getRowversion() {
        return this.rowversion;
    }

    public void setRowversion(Integer rowversion) {
        this.rowversion = rowversion;
    }

    public String getUpdatedby() {
        return this.updatedby;
    }

    public void setUpdatedby(String updatedby) {
        this.updatedby = updatedby;
    }

    public Timestamp getUpdateddate() {
        return this.updateddate;
    }

    public void setUpdateddate(Timestamp updateddate) {
        this.updateddate = updateddate;
    }

    public int getArchived() {
        return archived;
    }

    public void setArchived(int archived) {
        this.archived = archived;
    }
}

Employee.java

package com.kadir.entity.humanresource;

import com.kadir.entity.corporation.Company;
import com.kadir.entity.Base;

import java.io.Serializable;

import javax.persistence.*;


/**
 * The persistent class for the EMPLOYEE database table.
 * 
 */
@Cacheable
@Entity
@Table(name = "EMPLOYEE", schema = "HUMANRESOURCE")
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e")
public class Employee extends Base implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name = "COMPANYOBJID")
    private Company company;

    @Column(name = "FIRSTNAME")
    private String firstname;

    @Column(name = "GENDER")
    private int gender;

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "PHONE")
    private String phone;

    @Column(name = "LASTNAME")
    private String lastname;

    public Employee() {
    }

    public Company getCompany() {
        return this.company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    public String getFirstname() {
        return this.firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public int getGender() {
        return this.gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getLastname() {
        return this.lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

}

User.java

package com.kadir.entity.authorize;

import com.kadir.entity.Employee;
import com.kadir.entity.Base;
import java.io.Serializable;
import javax.persistence.*;


import java.util.List;


/**
 * The persistent class for the USER database table.
 * 
 */
@Cacheable
@Entity
@Table(name="USER", schema="AUTHORIZE")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User extends Base implements Serializable {
    private static final long serialVersionUID = 1L;

    @OneToOne
    @JoinColumn(name="EMPLOYEEOBJID")
    private Employee employee;

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

    @Column(name="PASSWORD")
    private String password;

    public User() {
    }

    public Employee getEmployee() {
        return this.employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}
克里斯

EclipseLink支持ON子句,因此请尝试使用

"SELECT e FROM Employee e LEFT JOIN User u on u.employee = e WHERE u.employee IS NULL"

您还可以使用exist和子查询:

"select e from Employee e where not exists (select 1 from User u where u.employee = e)"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PostgreSQL LEFT OUTER JOIN条件不起作用

来自分类Dev

MySQL LEFT JOIN不起作用

来自分类Dev

在MySql LEFT JOIN语句中使用多个ON条件不起作用

来自分类Dev

多个LEFT JOIN在SUM()上不起作用

来自分类Dev

MySQL LEFT JOIN 与 OR 条件

来自分类Dev

NHibernate Left Join的条件或为null

来自分类Dev

两个LEFT JOIN表的联合表不起作用

来自分类Dev

当INNER JOIN不起作用时,为什么LEFT JOIN导致“无法绑定多部分标识符”错误?

来自分类Dev

Linq to SQL Left Join with where子句查找条件或为null

来自分类Dev

dplyr left_join小于,大于条件

来自分类Dev

QueryDSL Left Join的附加条件为ON

来自分类Dev

使用WHERE条件的SQL LEFT JOIN

来自分类Dev

LEFT JOIN条件下的键顺序

来自分类Dev

Nhibernate Left Join 中的多个条件

来自分类Dev

如何为 LEFT JOIN 设置条件?

来自分类Dev

在此LEFT JOIN上避免NULL记录

来自分类Dev

Laravel雄辩的LEFT JOIN WHERE NULL

来自分类Dev

LEFT OUTER JOIN不返回NULL值

来自分类Dev

LINQ的LEFT JOIN产生NULL引用异常

来自分类Dev

LEFT JOIN 某些值返回为 NULL

来自分类Dev

详细解释JOIN与LEFT JOIN和WHERE条件表现建议

来自分类Dev

HIVE JOIN不起作用

来自分类Dev

MySQL JOIN不起作用

来自分类Dev

MySQL JOIN不起作用

来自分类Dev

SQL Join with NOT IN() 不起作用

来自分类Dev

带有条件条件的Postgresql LEFT JOIN

来自分类Dev

在LEFT JOIN内的SQL JOIN

来自分类Dev

在带有OR条件的LEFT JOIN中使用索引

来自分类Dev

LEFT JOIN根据WHERE条件的位置给出不同的数据集