Hibernate使用模型中不存在的字段生成错误查询

时间:2013-07-16 08:26:28

标签: java spring sql-server-2008 hibernate jpa

我正在使用Spring和Hibernate,我的层次结构模型存在SQL问题。这是我的模特:

my model graph

现在带注释的类:

@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生成正确的模型。这看起来下一张图片: enter image description here

问题这是SQL查询失败,因为尝试过滤“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,抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

问题在于 -

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

从这里你提到 - @JoinColumn(name="ESCALA_ID"),hibernate期待ESCALA_ID成为你{@ 1}}的一部分。

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