Hibernate hql选择表中的属性null

Hibernate hql选择表中的属性null,hibernate,Hibernate,我有两个实体Emplicato和Cargo: @Entity @Table(name = "empleado") public class Empleado { private Integer id; private String nombre; private String codigo; private Cargo cargo; @Id @Column(name = "id") @SequenceGenerator(name = "seq", sequenceName = "em

我有两个实体Emplicato和Cargo:

@Entity
@Table(name = "empleado")
public class Empleado  {
 private Integer id;
 private String nombre;
 private String codigo;
 private Cargo cargo;

@Id
@Column(name = "id")
@SequenceGenerator(name = "seq", sequenceName = "empleado_id_seq",allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

@Column(name = "nombre")
public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

@Column(name = "codigo")
public String getCodigo() {
    return codigo;
}

public void setCodigo(String codigo) {
    this.codigo = codigo;
}

@ManyToOne
@JoinColumn(name = "id_cargo_empresa")
public Cargo getCargo() {
    return cargo;
}

public void setCargo(Cargo cargo) {
    this.cargo = cargo;
}
}

我想在hql中执行以下查询:

@Override
public List<EmpleadoDTO> obtenerLstEmpleado() {
    StringBuilder sbQuery = new StringBuilder();
    sbQuery.append("select new com.consorciojm.rrhh.empleado.util.EmpleadoDTO(");
    sbQuery.append("e.id,e.codigo,e.nombre,e.apellidoPaterno,e.apellidoMaterno,");
    sbQuery.append("e.dni,e.telefono,e.celular,e.cargo.id,e.cargo.nombre) ");
    sbQuery.append("from Empleado e where e.codigo is not null ");
    List<EmpleadoDTO> lstEmpleado = sessionFactory.getCurrentSession().createQuery(sbQuery.toString()).list();
    return lstEmpleado;
}
@覆盖
公共列表获取者模板(){
StringBuilder sbQuery=新建StringBuilder();
追加(“选择newcom.consorciojm.rrhh.empleado.util.EmpleadoDTO(”);
附加(“e.id,e.codigo,e.nombre,e.apellidoPaterno,e.apellidoMaterno,”);
sbQuery.append(“e.dni,e.telefono,e.celular,e.cargo.id,e.cargo.nombre)”;
sbQuery.append(“来自Empleado e,其中e.codigo不为空”);
List lstemplado=sessionFactory.getCurrentSession().createQuery(sbQuery.toString()).List();
返回lstemplado;
}

但是Empleado中有一些记录在属性cargo(id\u cargo\u empresa=null)中为null,因此我需要查询返回结果,其中e.cargo.id=null和e.cargo.nombre,这样我就可以得到Empleado中数据为cargo或null的记录。我上面的查询没有返回任何内容,因为cargo为null,并且无法返回e.cargo.nombre。

使用e.cargo.nombre创建一个隐式的内部连接。因此,它有效地过滤掉了所有带有空货物的雇员。您想要一个连接:

select ..., cargo.nombre from from Empleado e 
left koin e.cargo cargo 
where e.codigo is not null
还请注意,使用StringBuilder创建查询的可读性和效率都不如使用
+
简单地连接部分(编译器将连接部分并仅将完整查询存储在类中,而不是在运行时连接)

select ..., cargo.nombre from from Empleado e 
left koin e.cargo cargo 
where e.codigo is not null