estoy usando los criterios de consulta en busca de clientes.
public class PurchaseOrder
{
.....
.....
@ManyToOne(fetch=FetchType.EAGER, optional=true)
@JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false)
@Fetch(FetchMode.JOIN)
@NotFound(action=NotFoundAction.IGNORE)
public ReportingCustomer getReportingCustomer()
{
return reportingCustomer;
}
}
Mientras que conseguir PurchaseOrder lo hace un LEFT OUTER JOIN de la siguiente manera
select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID
where ...
- Cuando hay una entrada en ReportingCustomer - Se dispara únicamente la consulta anterior.
- Cuando no hay ninguna entrada para ese registro en ReportingCustomer - Se activa una consulta para cada consulta PURCHASEORDER (m + 1).
Uso el controlador "Progress" para conectar con DB. No estoy seguro de por qué se dispara m + 1 consultas solo en el escenario 2.
¿Ha resuelto este problema? ¿Cómo te ayudó la respuesta aceptada? Estoy enfrentando el mismo problema, pero la respuesta aceptada no ayuda. –
Por ansioso es simple. Lazy dejará de cargarlo. Entonces la respuesta es perfecta aquí. Una pequeña pega es que cuando tienes la relación N a Uno, no funciona. Así que tenemos que ir con la instrumentación bytecode y el modificador de propiedades de campo. Sin embargo, es una característica de la hibernación. –
El problema, como sugieren el título y el contenido, es Hibernate emitiendo sentencias 'SELECT' para una relación' @ ManyToOne' con el tipo de búsqueda 'EAGER' cuando el modo fetch solicitado es' JOIN'. La respuesta aceptada establece que se elimine 'fetch = FetchType.EAGER' de la anotación, una acción que no cambiará nada ya que' EAGER' es el tipo de búsqueda predeterminado para la anotación; incluso si interpreta la respuesta como "change' EAGER' con 'LAZY'", eso no explica por qué Hibernate emite declaraciones 'SELECT' cuando se le ordena que no lo haga. –