Olá pessoal, estou gerando uma consulta via Criteria do Hibernate porém gostaria de otimiza-la.
Tenho duas entidades envolvidas.
PerguntaAvaliacao e SintomaAvaliacao
Cada pergunta corresponde a um sintoma, e minha consulta deve retornar todos os sintomas que existem em pelo menos uma pergunta.
Ok, vamos la … abaixo o .hbm.xml das duas entidades envolvidas.
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entidade.PerguntaAvaliacao" table="PERGUNTA_AVALIACAO"
dynamic-insert="true" dynamic-update="true">
<id name="cdPerguntaAvaliacao" type="java.lang.Long" column="CD_PERGUNTA_AVALIACAO" unsaved-value="0">
<generator class="sequence">
<param name="sequence">SEQ_PERGUNTA_AVALIACAO</param>
</generator>
</id>
<property name="dsPergunta" type="java.lang.String" not-null="true">
<column name="DS_PERGUNTA" />
</property>
<many-to-one name="sintomaAvaliacao" class="entidade.SintomaAvaliacao" not-null="true" lazy="false">
<column name="CD_SINTOMA_AVALIACAO" />
</many-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entidade.SintomaAvaliacao" table="SINTOMA_AVALIACAO" dynamic-insert="true" dynamic-update="true">
<id name="codigoSintomaAvaliacao" type="java.lang.Long" unsaved-value="0">
<column name="CD_SINTOMA_AVALIACAO"/>
<generator class="sequence">
<param name="sequence">SEQ_SINTOMA_AVALIACAO</param>
</generator>
</id>
<property name="dsSintoma" type="java.lang.String" not-null="true">
<column name="DS_SINTOMA" />
</property>
</class>
</hibernate-mapping>
Ok … com isso gerei o seguinte método para listar.
public List<SintomaAvaliacao> obterListaSintomasComPergunta() {
Criteria criteria = getSession().createCriteria(
PerguntaAvaliacao.class);
criteria.createAlias("sintomaAvaliacao", "sa");
criteria.setProjection(Projections.property("sintomaAvaliacao")); criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.addOrder(Order.asc("sa.dsSintoma"));
return criteria.list();
}
Blza, o resultado esta ok … porém o SQL gerado me parece não ser o melhor.
o Sql Gerado é o seguinte :
Hibernate: select this_.CD_SINTOMA_AVALIACAO as y0_ from PERGUNTA_AVALIACAO this_, SINTOMA_AVALIACAO sa1_,
where this_.CD_SINTOMA_AVALIACAO=sa1_.CD_SINTOMA_AVALIACAO order by sa1_.DS_SINTOMA asc
E PARA CADA SINTOMA ENCONTRADO ELE GERA UM NOVO SELECT ASSIM !!!!
Hibernate: select sintomaava0_.CD_SINTOMA_AVALIACAO as CD1_89_0_, sintomaava0_.DS_SINTOMA as DS2_89_0_from SINTOMA_AVALIACAO sintomaava0_ where sintomaava0_.CD_SINTOMA_AVALIACAO=?
09:58:57 INFO SintomaAvaliacaoServiceImpl:71 - EXECUTADO -> obterListaSintomasComPerguntaProtocolo
Blza … eu gostaria de que o SQL gerado já fizesse um join e me gerasse um SQL como este:
select
distinct sa1_.*
from PERGUNTA_AVALIACAO this_,
SINTOMA_AVALIACAO sa1_,
where this_.CD_SINTOMA_AVALIACAO=sa1_.CD_SINTOMA_AVALIACAO
order by sa1_.DS_SINTOMA asc
Ou seja, no próprio SQL gerado ele já tenha os dados do sintoma, não precisando gerar um SQL para cada sintoma posteriormente.
Pessoal, sei que o código é meio extenso, mas se alguém souber alguma forma de me ajudar ficarei muito agradecido.
PS: Preciso desta consulta com Criteria(não pode ser HQL), por padrão estabelecido aqui na empresa.
Estou a disposição para mais esclarecimentos se necessário.
Agradecido.