Olá amigos, gostaria de saber como converter a consuta HQL abaixo, na sua representação em Critéria.
A idéia é: Buscar Acomodações disponíveis
Em outras palavras, buscar acomodaçções que não tenham reservas naquele periodo ..
O problema é, como fazer aquele sub-Select... :?
StringHQL=""+" from Acomodacao as acomodacao"+" WHERE "+" ("+" select count(res) from Reserva as res "+" WHERE "+" ("+" res.dataInicio between :dataInicio and :dataFim"+" OR "+" res.dataFim between :dataInicio and :dataFim"+" )"+" AND res.acomodacao.id = acomodacao.id "+" ) = 0"+" ORDER BY acomodacao.numero"+"";Queryquery=session.createQuery(HQL);//Definiçãodosparâmetrosquery.setDate("dataInicio",dataInicio);query.setDate("dataFim",dataFim);
Estava fazendo em critéria, como não conseguim resolvi usar HQL...
Mas quero saber como fazer em critéria.
Aew galera , consegui, depois de tanto bater cabeça.... hehehe
E valeu windsofhell pela dica.
Ta ai pra quem precisar...
:arrow: Antes
String HQL = "" +
" from Acomodacao as acomodacao" +
" WHERE " +
" (" +
" select count(res) " +
" from Reserva as res " +
" inner join res.statusReserva as statusReserva" +
" WHERE " +
" (" +
" res.dataInicio between :dataInicio and :dataFim" +
" OR " +
" res.dataFim between :dataInicio and :dataFim" +
" )" +
" AND res.acomodacao.id = acomodacao.id " +
" AND statusReserva.descricao <> :statusReserva" +
" ) = 0" +
" ORDER BY acomodacao.numero" +
"";
:arrow: Depois
// Critérias// ==================CriteriaacomodacaoCriteria=session.createCriteria(Acomodacao.class,"acomodacaoAtual");DetachedCriteriareservaCriteria=DetachedCriteria.forClass(Reserva.class,"reserva");// Usado para o sub-selectreservaCriteria.createAlias("statusReserva","statusReserva",DetachedCriteria.INNER_JOIN);acomodacaoCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);// Refinação da busca// ===============================================, acomodacaoCriteria.add(Restrictions.eq("tipoAcomodacao.id",(long)1));// Sub-select para busca de reservas// se for encontrado mais de 1 reserva "pode" significar que a acomodação não esta disponivel // Retorna a quantidade de Reservas reservaCriteria.setProjection(Projections.projectionList().add(Projections.rowCount(),"numReservas"));CriterionreservasCadastrada=Restrictions.or(Restrictions.between("dataInicio",dataInicio,dataFim),Restrictions.between("dataFim",dataInicio,dataFim));// Pegar somente as reservas "não canceladas"reservaCriteria.add(Restrictions.not(Restrictions.eq("statusReserva.descricao",Constantes.STATUS_RESERVA_CANCELADA)));reservaCriteria.add(reservasCadastrada);// Usado para buscar as reservas da acomodação atualreservaCriteria.add(Restrictions.eqProperty("acomodacao.id","acomodacaoAtual.id"));// Se as reservas for igual a 0, significa que está disponivelacomodacaoCriteria.add(Subqueries.eq(0,reservaCriteria));List<Object>acomodacoes=acomodacaoCriteria.list();