2013-07-16 31 views
0

我使用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中,和我的英語不好

回答

0

問題是在該行對不起 -

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

因爲在這裏你所提到的 - @JoinColumn(name="ESCALA_ID"),冬眠預計ESCALA_ID到您的表tsh_sol_inc_ca的一部分。

你需要用正確的列名稱映射,如果上述不當

+0

是的,但它是在tsh_GenericSolicitud – earnaz

+0

如何力創造孩子的此列? – earnaz