excesive querys我有以下實體:JPA映射實體
@Name("estructuraOrganica")
@Entity
@Table(name = "srht_estructuras_organicas")
public class EstructuraOrganica extends EntidadBasica implements Auditable,
Desplegable<EstructuraOrganica> {
private static final long serialVersionUID = 1L;
@NotNull
@Length(max = 50)
@Column(name = "codigo", nullable = false, length = 50)
private String codigo;
@Length(max = 300)
@Column(name = "nombre", nullable = true, length = 160)
private String nombre;
@Column(name = "institucion_id")
private Long institucionId;
@NotNull
@Length(max = 1)
@Column(name = "es_uarh", nullable = false, length = 1)
private String esUARH;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "catalogo_jerarquia_proceso_unidad_id", nullable = false)
@Fetch(FetchMode.SELECT)
private Catalogo catalogoJerarquiaProcesoUnidad;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "estatuto_id", nullable = false)
private Estatuto estatuto;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name = "estructura_organica_padre_id", nullable = true)
private EstructuraOrganica estructuraOrganicaPadre;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name = "padre_auxiliar_estructura_id", nullable = true)
private EstructuraOrganica estructuraOrganicaJerarquia;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "estado_id", nullable = false)
@Fetch(FetchMode.SELECT)
private Estado estado;
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "estructuraOrganicaPadre")
@OrderBy(value = "codigo")
private List<EstructuraOrganica> estructurasOrganicas;
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "estructuraOrganica")
private List<OrganigramaPosicion> organigramasPosiciones;
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "estructuraOrganica")
@Where(clause = "estado_id=1")
private List<OrganigramaPosicion> organigramasPosicionesActivas;
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "estructuraOrganicaPadre")
@OrderBy(value = "codigo")
@Where(clause = "estado_id=1")
private List<EstructuraOrganica> estructurasOrganicasActivas;
@Column(name = "estado_plan_vacaciones")
private Integer estadoPlanVacaciones;
@Column(name = "tipo")
private Integer tipo;
@Column(name = "puesto_jefe_inmediato")
private Long puestoJefeInmediato;
@Length(max = 10)
@Column(name = "codigo_mef", nullable = true, length = 10)
private String codigoMef;
@Transient
private Boolean puedeEliminarse;
@Transient
private Boolean uarh;
@Transient
private Boolean puedeGrabarse;
@Transient
private RegimenDePersonal regimenDePersonal;
@Column(name="institucion_desconcentrada_id")
private Long institucionDesconcentradaId;
... Getters and Setters omitted...
}
現在JPQL查詢,發現這個實體的某些實例如下:
SELECT o FROM EstructuraOrganica o WHERE o.estatuto.institucion.id=:institucionId and o.estructuraOrganicaPadre is null AND o.estado.id=1 ORDER BY o.codigo ASC")
然而,問題是這個簡單的查詢產生了對數據庫的調用的過分計數......基本上做選擇。做同樣的本機SQL可能是:
SELECT * from sch_senres.srht_estructuras_organicas,
sch_senres.srht_estatutos,
sch_senres.srht_instituciones,
sch_senres.srht_estados
WHERE sch_senres.srht_estructuras_organicas.estatuto_id=sch_senres.srht_estatutos.id
AND sch_senres.srht_estructuras_organicas.estado_id=sch_senres.srht_estados.id
AND sch_senres.srht_estatutos.institucion_id=sch_senres.srht_instituciones.id
AND sch_senres.srht_instituciones.id=91122
AND sch_senres.srht_estados.id=1
AND sch_senres.srht_estructuras_organicas.estructura_organica_padre_id IS NULL
ORDER BY sch_senres.srht_estructuras_organicas.codigo
這樣的想法是創建一個NativeQuery這樣的:
Query query=entityManager.createNativeQuery("SELECT * from sch_senres.srht_estructuras_organicas,"+ "sch_senres.srht_estatutos,sch_senres.srht_instituciones,"+
"sch_senres.srht_estados "+
"WHERE sch_senres.srht_estructuras_organicas.estatuto_id=sch_senres.srht_estatutos.id "+
"AND sch_senres.srht_estructuras_organicas.estado_id=sch_senres.srht_estados.id "+
"AND sch_senres.srht_estatutos.institucion_id=sch_senres.srht_instituciones.id "+
"AND sch_senres.srht_instituciones.id= :institucionId "+
"AND sch_senres.srht_estados.id=1 "+
"AND sch_senres.srht_estructuras_organicas.estructura_organica_padre_id IS NULL "+
"ORDER BY sch_senres.srht_estructuras_organicas.codigo", EstructuraOrganica.class);
query.setParameter("institucionId", institucionId);
但是我沒有結果......休眠還會繼續這樣做就像50個來電數據庫。有人知道爲什麼會發生這種情況,我怎麼能避免這麼多的電話?非常感謝。
50個電話在做什麼? – atrain