我将 Spring 与 Hibernate 一起使用,但层次模型存在 SQL 问题。这是我的模型:
现在带有注释的类:
@MappedSuperclass
@Configurable
@Filter(name = "noBorrado")
public abstract class AbstractEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Autowired
@Transient
protected AbstractEntityDAO dao;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private User userCreated;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private User userUpdated;
@JsonIgnore
@Temporal(TemporalType.TIMESTAMP)
private Calendar dateCreated;
@JsonIgnore
@Temporal(TemporalType.TIMESTAMP)
private Calendar lastUpdated;
@JsonIgnore
@Column(nullable = false, columnDefinition = "bit default 0")
private boolean borrado = false;
}
@MappedSuperclass
@Configurable
@Filter(name="escala")
public abstract class AbstractEntityByEscala extends AbstractEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="ESCALA_ID")
private Escala escala;
}
@Entity
@Table(name="TSH_GENERIC_SOLICITUD")
@Inheritance(strategy=InheritanceType.JOINED)
public class GenericSolicitud extends AbstractEntityByEscala {
private static final long serialVersionUID = 1L;
public enum Estados {
ACEPTADO, RECHAZADO, PENDIENTE_SOLICITADO, PENDIENTE_PLANIFICADOR, CANCELADO
}
@NotEmpty
@ManyToOne
private Empleado empleadoSolicitante;
@NotEmpty
@Enumerated(EnumType.ORDINAL)
private Estados estado;
@NotEmpty
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="SOLICITUD_ID")
private List<SolicitudDia> dias;
private Boolean notificacionVista;
/* FILTRADO EMPLEADOS */
@Transient
private List<Estados> _estados;
@Transient
private Calendar _fechaInicio;
@Transient
private Calendar _fechaFin;
@Transient
private Cuadrante _cuadrante;
@Transient
private AreaTrabajo _areaTrabajo;
@Transient
private Departamento _departamento;
@Transient
private Tipo _tipoCalendario;
}
@Entity
@Table(name = "TSH_SOL_INC_CA")
public class SolicitudComunicacionAusencia extends GenericSolicitud {
private static final long serialVersionUID = 1L;
public enum Motivos {
ENFERMEDAD, ASUNTOS_PROPIOS, OTROS
}
@NotEmpty
@Enumerated(EnumType.ORDINAL)
private Motivos motivo;
@Column(length = 200)
private String observaciones;
/* FILTRADO EMPLEADOS */
@Transient
private List<Motivos> _motivos;
}
好的。如果在我的 persistence.xml 中,我将属性“hibernate.hbm2ddl.auto”设置为“update”。Hibernate 生成正确的模型。这看起来如何下一张图片:
问题是 SQL 查询失败,因为 try filter by "tsh_sol_inc_ca.escala_id" 显然不存在。我的问题是我该如何解决这个问题。
SELECT DISTINCT solicitudc0_.id AS id1_33_,
solicitudc0_1_.borrado AS borrado2_33_,
solicitudc0_1_.datecreated AS datecrea3_33_,
solicitudc0_1_.lastupdated AS lastupda4_33_,
solicitudc0_1_.usercreated AS USERCREA7_33_,
solicitudc0_1_.userupdated AS USERUPDA8_33_,
solicitudc0_1_.escala_id AS ESCALA9_33_,
solicitudc0_1_.empleadosolicitante AS EMPLEAD10_33_,
solicitudc0_1_.estado AS estado5_33_,
solicitudc0_1_.notificacionvista AS notifica6_33_,
solicitudc0_.motivo AS motivo1_48_,
solicitudc0_.observaciones AS observac2_48_
FROM tsh_sol_inc_ca solicitudc0_
INNER JOIN tsh_generic_solicitud solicitudc0_1_
ON solicitudc0_.id = solicitudc0_1_.id
INNER JOIN tsh_empleados empleado1_
ON solicitudc0_1_.empleadosolicitante = empleado1_.id
INNER JOIN tsh_usuarios empleado1_1_
ON empleado1_.id = empleado1_1_.id
INNER JOIN tsh_horarios horarios2_
ON empleado1_.id = horarios2_.empleado
LEFT OUTER JOIN tsh_cuadrantes cuadrante3_
ON horarios2_.cuadrante = cuadrante3_.id
INNER JOIN tsh_areas_trabajo areatrabaj4_
ON cuadrante3_.areatrabajo = areatrabaj4_.id
INNER JOIN tsh_departamentos departamen5_
ON areatrabaj4_.departamento = departamen5_.id
WHERE 1 = solicitudc0_.escala_id
AND solicitudc0_.borrado = 0
AND 1 = solicitudc0_1_.escala_id
AND solicitudc0_1_.borrado = 0
AND departamen5_.id = 9
AND ( Ltrim(Rtrim(Upper(departamen5_.codigo))) LIKE '%RAM%' );
PD:我使用的是 SQL Server 2008,抱歉我的英语不好