0

我将 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,抱歉我的英语不好

4

1 回答 1

0

问题出在一线 -

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="ESCALA_ID")
private Escala escala;

既然在这里你已经提到- @JoinColumn(name="ESCALA_ID"),hibernate 是期待ESCALA_ID你的表的一部分tsh_sol_inc_ca

如果上面不正确,您需要用正确的列名映射它

于 2013-07-16T09:03:55.177 回答