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 は正しいモデルを生成します。これは次の画像のように見えます: ここに画像の説明を入力

問題は、明らかに存在しない "tsh_sol_inc_ca.escala_id" でフィルタしようとすると、SQL クエリが失敗することです。私の質問は、どうすればこの問題を解決できるかということです。

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")期待しています。ESCALA_IDtsh_sol_inc_ca

上記が不適切な場合は、正しい列名でマップする必要があります

于 2013-07-16T09:03:55.177 に答える