hql在表中选择属性null

时间:2014-09-10 19:42:55

标签: hibernate

我有两个实体Empleado和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;
}

}

@Entity
@Table(name = "cargo")
public class Cargo implements Serializable {

private Integer id;
private String nombre;
private String descripcion;

@Id
@Column(name = "id")
@SequenceGenerator(name = "seq", sequenceName = "cargo_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 = "descripcion")
public String getDescripcion() {
    return descripcion;
}

public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}

我希望在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;
}

但是Empleado中的记录在属性货物中有空(id_cargo_empresa = null),所以我需要查询返回e.cargo.id = null和e.cargo.nombre的结果,这样我得到记录Empleado的货物数据或无效。我上面提到的查询并没有返回任何内容,因为货物为空并且无法返回e.cargo.nombre。

1 个答案:

答案 0 :(得分:0)

使用e.cargo.nombre创建隐式内部连接。所以它有效地过滤掉所有带零货的empleados。您想要加入:

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

另请注意,使用StringBuilderto创建查询的可读性较低,并且比使用+简单地连接部分效率低(编译器会连接部件并仅在类中存储完整查询,而不是在运行时连接)。