Ola pessoal.
Gostaria que vocês ajudassem a exclarecer o porque de um metodo meu que executa getHibernateTemplate().findByCriteria
estar pesquisando duas vezes sendo que da primeira, fica claro pelo script gerado pelo hibernate, que ja possui todo o conteudo a ser retornado.
O metodo foi implementado desta maneira:
public Collection listarAtivosByTecnologia(
PlanoFaturamento planoFaturamento, TipoPedido tipoPedido, CSA csa,
Collection tecnologias) {
final String METHOD_NAME = "listarAtivosByTecnologia";
logger.logInfo(METHOD_NAME, ILogger.METHOD_START);
DetachedCriteria c = DetachedCriteria.forClass(PacoteMinutos.class);
c.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
c.add(Restrictions.gt("id", new Long(0)));
c.add(Restrictions.eq("ativo", Boolean.FALSE));
c.createAlias("pacotesPlano", "pacotePlano");
c.add(Restrictions.eq("pacotePlano.flagLinha", Boolean.TRUE));
c.add(Restrictions.eq("pacotePlano.pk.planoFaturamento",
planoFaturamento));
c.add(Restrictions.eq("pacotePlano.pk.tipoPedido", tipoPedido));
c.createAlias("csas", "csa");
c.add(Restrictions.eq("csa.id", csa.getId()));
c.createAlias("servico", "servico");
c.createAlias("servico.tipoCanal", "tipoCanal");
c.createAlias("tipoCanal.tecnologias", "tecnologias");
Long tecnologiasId[] = new Long[tecnologias.size()];
Iterator it = tecnologias.iterator();
int i = 0;
while (it.hasNext()) {
Tecnologia tec = (Tecnologia) it.next();
tecnologiasId[i] = tec.getId();
i++;
}
c.add(Restrictions.in("tecnologias.id", tecnologiasId));
c.addOrder(Order.asc("descricao"));
Collection listaAtivos = getHibernateTemplate().findByCriteria(c);
logger.logInfo(METHOD_NAME, ILogger.METHOD_END);
return listaAtivos;
}
No momento que ele executa o codigo Collection listaAtivos = getHibernateTemplate().findByCriteria(c);
é executado o seguinte script:
12:06:50,468 DEBUG SQL:346 - /* criteria query */
select
this_.PACM_PACOTE_CD as PACM1_64_5_,
this_.PACM_PACOTE_NO as PACM2_64_5_,
this_.PACM_ENCARGO_CD as PACM3_64_5_,
this_.PACM_SUBORDINADAS_QT as PACM4_64_5_,
this_.PACM_EXCLUIDO_FL as PACM5_64_5_,
this_.PACM_DIAS_VIGENCIA as PACM6_64_5_,
this_.ROCS_ID as ROCS7_64_5_,
pacoteplan1_.PACM_PACOTE_CD as PACM1_66_0_,
pacoteplan1_.BIPL_ID as BIPL2_66_0_,
pacoteplan1_.TIPP_TIPO_PEDIDO_CD as TIPP3_66_0_,
pacoteplan1_.PACP_MESTRE_FL as PACP4_66_0_,
pacoteplan1_.PACP_LINHA_FL as PACP5_66_0_,
csas8_.PACM_PACOTE_CD as PACM1_,
csa2_.COAR_ID as COAR2_,
csa2_.COAR_ID as COAR1_26_1_,
csa2_.COAR_CSA as COAR2_26_1_,
csa2_.COAR_AREA_CD as COAR3_26_1_,
csa2_.COAR_ATIVO_FL as COAR4_26_1_,
csa2_.ROCS_ID as ROCS5_26_1_,
csa2_.COAR_CSA||' / '||csa2_.COAR_AREA_CD as formula1_1_,
servico3_.SECS_NAME as SECS1_89_2_,
servico3_.SECS_TYPE as SECS2_89_2_,
servico3_.SECS_DESC as SECS3_89_2_,
servico3_.CHTY_ID as CHTY4_89_2_,
tipocanal4_.CHTY_ID as CHTY1_134_3_,
tipocanal4_.CHTY_TYPE as CHTY2_134_3_,
tipocanal4_.CHTY_DESC as CHTY3_134_3_,
tecnologia12_.CHTY_ID as CHTY1_,
tecnologia5_.TITC_TECNOLOGIA_CD as TITC2_,
tecnologia5_.TITC_TECNOLOGIA_CD as TITC1_107_4_,
tecnologia5_.TITC_TECNOLOGIA_DS as TITC2_107_4_,
tecnologia5_.TITC_EXCLUIDO_FL as TITC3_107_4_
from
PACM_PACOTE_MINUTOS this_
inner join PACP_PACOTE_PLANO pacoteplan1_ on
this_.PACM_PACOTE_CD=pacoteplan1_.PACM_PACOTE_CD
inner join (
select distinct
coar.COAR_ID,
pacm.PACM_PACOTE_CD
from
PACM_PACOTE_MINUTOS pacm
inner join SECS_SERVICOS_CSA secs on
secs.SECS_NAME = pacm.PACM_ENCARGO_CD
inner join coar_controle_area coar on
coar.COAR_ID = secs.COAR_ID and coar.ROCS_ID = pacm.ROCS_ID
where
secs.SECS_ATIVO_FL = 'S'
) csas8_ on
this_.PACM_PACOTE_CD=csas8_.PACM_PACOTE_CD
inner join COAR_CONTROLE_AREA csa2_ on
csas8_.COAR_ID=csa2_.COAR_ID
inner join VW_SECS_SERVICOS_CSA servico3_
on this_.PACM_ENCARGO_CD=servico3_.SECS_NAME
inner join CHTY_CHANNEL_TYPE tipocanal4_
on servico3_.CHTY_ID=tipocanal4_.CHTY_ID
inner join TCCH_TITC_CHTY tecnologia12_ on
tipocanal4_.CHTY_ID=tecnologia12_.CHTY_ID
inner join TITC_TIPO_TECNOLOGIA tecnologia5_
on tecnologia12_.TITC_TECNOLOGIA_CD=tecnologia5_.TITC_TECNOLOGIA_CD
where
this_.PACM_PACOTE_CD > 0
and this_.PACM_EXCLUIDO_FL=?
and pacoteplan1_.PACP_LINHA_FL=?
and pacoteplan1_.BIPL_ID=?
and pacoteplan1_.TIPP_TIPO_PEDIDO_CD=?
and csa2_.COAR_ID=?
and tecnologia5_.TITC_TECNOLOGIA_CD in (?)
order by
this_.PACM_PACOTE_NO asc
Na sequencia ele busca novamente as informações para cada item retornado no script acima, observe que estas informações ja teria sido retornada com o script anterior.
Segunda pesquisa:
11:31:56,437 DEBUG SQL:346 -
/* load br.com.vivo.scc.model.entity.hibernate.PacoteMinutos */
select
pacoteminu0_.PACM_PACOTE_CD as PACM1_64_0_,
pacoteminu0_.PACM_PACOTE_NO as PACM2_64_0_,
pacoteminu0_.PACM_ENCARGO_CD as PACM3_64_0_,
pacoteminu0_.PACM_SUBORDINADAS_QT as PACM4_64_0_,
pacoteminu0_.PACM_EXCLUIDO_FL as PACM5_64_0_,
pacoteminu0_.PACM_DIAS_VIGENCIA as PACM6_64_0_,
pacoteminu0_.ROCS_ID as ROCS7_64_0_
from
PACM_PACOTE_MINUTOS pacoteminu0_
where
pacoteminu0_.PACM_PACOTE_CD=?
É executado o script acima para cada linha do retorno do primeiro script.
O Mapeamento HBM principal desta criteria esta assim:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="br.com.vivo.scc.model.entity.hibernate">
<class
name="PacoteMinutos"
batch-size="40"
table="PACM_PACOTE_MINUTOS">
<cache usage="read-write"/>
<id
name="id"
type="java.lang.Long"
column="PACM_PACOTE_CD"
>
<generator class="sequence">
<param name="sequence">PACM_PACOTE_MINUTOS_SEQ</param>
</generator>
</id>
<property
name="descricao"
type="java.lang.String"
column="PACM_PACOTE_NO"
length="255"
/>
<property
name="codigo"
type="java.lang.String"
column="PACM_ENCARGO_CD"
length="50"
/>
<property
name="quantidade"
type="java.lang.Long"
column="PACM_SUBORDINADAS_QT"
length="10"
/>
<property
name="ativo"
type="br.com.vivo.framework.utility.HibernateSNBoolean"
column="PACM_EXCLUIDO_FL"
length="2"
/>
<property
name="diasVigencia"
type="java.lang.Integer"
column="PACM_DIAS_VIGENCIA"
length="3"
/>
<!-- Associations -->
<many-to-one
name="rootCSA"
class="RootCSA">
<column name="ROCS_ID"/>
</many-to-one>
<bag name="pacotesPlano" cascade="all-delete-orphan">
<key update="false">
<column name="PACM_PACOTE_CD" not-null="true"/>
</key>
<one-to-many class="PacotePlano"/>
</bag>
<bag name="csas" cascade="lock,evict" inverse="false">
<subselect>
select distinct coar.COAR_ID, pacm.PACM_PACOTE_CD
from PACM_PACOTE_MINUTOS pacm
inner join SECS_SERVICOS_CSA secs on secs.SECS_NAME = pacm.PACM_ENCARGO_CD
inner join coar_controle_area coar on coar.COAR_ID = secs.COAR_ID and coar.ROCS_ID = pacm.ROCS_ID
where secs.SECS_ATIVO_FL = 'S'
</subselect>
<key column="PACM_PACOTE_CD"/>
<many-to-many class="CSA" column="COAR_ID"/>
</bag>
<many-to-one
name="servico"
class="Servico"
cascade="lock,evict"
insert="false"
update="false"
>
<column name="PACM_ENCARGO_CD"/>
</many-to-one>
</class>
</hibernate-mapping>
Por favor me ajudam a exclarecer o motivo desta segunda pesquisa desnecessaria.
Abraços.