我有两个实体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。
答案 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创建查询的可读性较低,并且比使用+
简单地连接部分效率低(编译器会连接部件并仅在类中存储完整查询,而不是在运行时连接)。