HQL para Critéria

2 respostas
RicardoCobain

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... :?

String HQL = "" +
				" 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" +
				"";

		Query query = session.createQuery(HQL);
		
		// Definição dos parâmetros
		query.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.

2 Respostas

W

http://www.hibernate.org/hib_docs/reference/en/html/querycriteria-detachedqueries.html

mais especificamente esse exemplo :

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .add( Subqueries.geAll("weight", weights) )
    .list();
RicardoCobain

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
		// ==================
		Criteria acomodacaoCriteria = session.createCriteria(Acomodacao.class, "acomodacaoAtual");
		DetachedCriteria reservaCriteria = DetachedCriteria.forClass(Reserva.class, "reserva"); // Usado para o sub-select
		reservaCriteria.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")
		);
		
		Criterion reservasCadastrada = 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 atual
		reservaCriteria.add(Restrictions.eqProperty("acomodacao.id", "acomodacaoAtual.id"));



		// Se as reservas for igual a 0, significa que está disponivel
		acomodacaoCriteria.add(Subqueries.eq(0, reservaCriteria));

		
		List<Object> acomodacoes = acomodacaoCriteria.list();
Criado 27 de setembro de 2008
Ultima resposta 27 de set. de 2008
Respostas 2
Participantes 2