Converter Sql Para Restrictions [RESOLVIDO]

Pessoal boa noite… Desculpe a pergunta mas não consigo achar onde estou errando… estou iniciando com Hibernate e criteria to tentando converter uma sql para criteria e não acerto…


	SELECT * FROM agendamentos M WHERE 
	( 
		(
			( ( '2011-06-15 22:15' >= M.dataEHoraAgendamento ) AND ( '2011-06-15 22:15' < M.horarioEstimadoEntrega ) ) 
		OR 
			( ( '2011-06-15 22:50' >= M.dataEHoraAgendamento ) AND ( '2011-06-15 22:50' < M.horarioEstimadoEntrega ) ) 
		)
	OR (
			( ( '2011-06-15 22:15' <= M.dataEHoraAgendamento ) AND ( '2011-06-15 22:50' > M.horarioEstimadoEntrega ) ) 
		
		)
	)	

tipo a sql acima to gerando assim

	List<AgendamentoVO> lista = new ArrayList<AgendamentoVO>();

		try {
			this.sessao = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = this.sessao.createCriteria(AgendamentoVO.class);

			criteria.add(Restrictions.or(
			
					Restrictions.or(
							Restrictions.and(Restrictions.ge("dataEHoraAgendamento", DateHighLow.segundosLowValues(agendamentoVO.getDataEHoraAgendamento())),
							Restrictions.lt("horarioEstimadoEntrega", DateHighLow.segundosHighValues(agendamentoVO.getHorarioEstimadoEntrega())))
							,
							Restrictions.and(Restrictions.ge("dataEHoraAgendamento", DateHighLow.segundosLowValues(agendamentoVO.getDataEHoraAgendamento())),
							Restrictions.lt("horarioEstimadoEntrega", DateHighLow.segundosHighValues(agendamentoVO.getHorarioEstimadoEntrega())))
						
					),	
				
					Restrictions.and(Restrictions.le("dataEHoraAgendamento", DateHighLow.segundosHighValues(agendamentoVO.getDataEHoraAgendamento())),
					Restrictions.gt("horarioEstimadoEntrega", DateHighLow.segundosLowValues(agendamentoVO.getHorarioEstimadoEntrega())))
			
			));		
			
			criteria.addOrder(Order.asc("dataEHoraAgendamento"));

			lista = (ArrayList<AgendamentoVO>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
			lista = null;
		} finally {
			this.sessao.close();
		}

no banco para teste tem 10 registros quando tento consultar ele duplica os registros … Qm puder ajudar muito obrigado …!! E desculpe se falei alguma bobeira …

não sei porque desalinho o código …???

Opa, blza, posso te dar uma dica que não tem mto a ver com sua dúvida, mas pode melhorar seu código.

ao inves de utilizar Restrictions.lt e Restrictions.gt utiliza Restrictions.between

Para pesquisas entre datas tem um melhor rendimento.

Fikdik

Amigo igor_henrique, muito obrigado peja dica meu velho não sabia disto… muito obrigado… uma duvida rapida tem casos que preciso pegar em um extremidade ex: >= e na outra < entende tem como personalizar isto no between? sou novato nisto eu pensei que tipo ele sempre pegava > < ou >= =< saca…!!

é o between considera como <= e >= então a melhor forma de personalizar isso
é na extremidade que vc não quer o igual, vc colocar um segundo a mais, vi no seu código que vc zera os segundos de um lado e maximiza
os segundos no outro, tudo que vc tem que fazer é aumentar ou diminuir mais um milisegundo quando vc não quer o igual.

com Calendar vc consegue manipular isso legal

haha feio o que eu fiz neh usuahsuash q adaptação … hehe não sabia vou da uma olhada olha como eu estava fazendo que lusitano heheh


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateHighLow {

	private static Date dataAuxiliar = null;
	private static SimpleDateFormat dateFormat = null;
	private static StringBuffer stringBuffer = null;

	public static Date segundosHighValues(Date date) {
		dataAuxiliar = new Date();
		dateFormat = new SimpleDateFormat("yyyy/MM/dd - HH.mm");
		stringBuffer = new StringBuffer();
		stringBuffer.append(dateFormat.format(date));
		stringBuffer.append(".59.999");
		dateFormat = new SimpleDateFormat("yyyy/MM/dd - HH.mm.ss.SSS");
		try {
			dataAuxiliar.setTime(dateFormat.parse(stringBuffer.toString())
					.getTime());
		} catch (ParseException e) {
		}
		return dataAuxiliar;
	}

	public static Date segundosLowValues(Date date) {
		dataAuxiliar = new Date();
		dateFormat = new SimpleDateFormat("yyyy/MM/dd - HH.mm");
		stringBuffer = new StringBuffer();
		stringBuffer.append(dateFormat.format(date));
		stringBuffer.append(".00.000");
		dateFormat = new SimpleDateFormat("yyyy/MM/dd - HH.mm.ss.SSS");
		try {
			dataAuxiliar.setTime(dateFormat.parse(stringBuffer.toString())
					.getTime());
		} catch (ParseException e) {
		}
		return dataAuxiliar;
	}

}

To vendo que criteria ta dando muito trabalho estou vendo como fazer com @NamedQueries porem não sei porque não traz a pesquisa!!

Se alguem puder ajudar-me…!!

Estou Utilizando assim:

@NamedQueries(value = { @NamedQuery(name = "Agendamento.findRangeAgendamento", query = "SELECT M FROM AgendamentoVO M WHERE (  M.funcionarioServico.id = ? AND ( ( ( ? >= M.dataEHoraAgendamento ) AND ( ? < M.horarioEstimadoEntrega ) ) OR ( ( ? >= M.dataEHoraAgendamento ) AND ( ? < M.horarioEstimadoEntrega ) ) ) OR ( ( ( ? <= M.dataEHoraAgendamento ) AND ( ? > M.horarioEstimadoEntrega ) ) ) )") })

DAO:

	@SuppressWarnings("unchecked")
	public List<AgendamentoVO> rangeDeAgendamentos(AgendamentoVO agendamentoVO)
			throws Exception {

		List<AgendamentoVO> lista;

		try {
			this.sessao = HibernateUtil.getSessionFactory().openSession();

			Query query = this.sessao
					.getNamedQuery("Agendamento.findRangeAgendamento");
			query.setInteger(0, agendamentoVO.getFuncionarioServico().getId());

			query.setDate(1, DateHighLow.segundosLowValues(agendamentoVO
					.getDataEHoraAgendamento()));
			query.setDate(2, DateHighLow.segundosHighValues(agendamentoVO
					.getDataEHoraAgendamento()));

			query.setDate(3, DateHighLow.segundosLowValues(agendamentoVO
					.getHorarioEstimadoEntrega()));
			query.setDate(4, DateHighLow.segundosHighValues(agendamentoVO
					.getHorarioEstimadoEntrega()));

			query.setDate(5, DateHighLow.segundosHighValues(agendamentoVO
					.getDataEHoraAgendamento()));
			query.setDate(6, DateHighLow.segundosLowValues(agendamentoVO
					.getHorarioEstimadoEntrega()));

			lista = (ArrayList<AgendamentoVO>) query.list();

		} catch (Exception e) {
			e.printStackTrace();
			lista = null;
		} finally {
			this.sessao.close();
		}
		return lista;
	}

Pessoal resolvi aqui porem acredito que esta longe de estar perto do que deveria ser… mas to com prazos hehe e se alguem solber o porque tive que fazer isso!!
A antes, comecei com Criteria depois namedQuery e no final so to usando query hahah…

Seguinte não consigui trazer resultados do manco setando um Date, não sei o motivo fiz uma adapitação hehe… para que o data fosse para o banco como String e no formato da TimesTemp
ai vai entao…

@Temporal(TemporalType.TIMESTAMP)
	@Column(nullable = false)
	private Date dataEHoraAgendamento;
@SuppressWarnings("unchecked")
	public List<AgendamentoTO> rangeDeAgendamentos(AgendamentoTO pAgendamentoTO)
			throws Exception {

		List<AgendamentoTO> lista ;

		try {
			this.sessao = HibernateUtil.getSessionFactory().openSession();

			StringBuffer sql = new StringBuffer();

			sql.append("FROM AgendamentoTO M WHERE");
			sql.append("(  M.funcionarioServico.id = ?");
			sql.append("AND");
			sql.append("	(");
			sql
					.append("		( ( ? >= M.dataEHoraAgendamento ) AND ( ? < M.horarioEstimadoEntrega ) )");
			sql.append("	OR");
			sql
					.append("		( ( ? >= M.dataEHoraAgendamento ) AND ( ? < M.horarioEstimadoEntrega ) )");
			sql.append("	)");
			sql.append("OR (");
			sql
					.append("		( ( ? <= M.dataEHoraAgendamento ) AND ( ? > M.horarioEstimadoEntrega ) )");
			sql.append("	)");
			sql.append(")ORDER BY M.dataEHoraAgendamento");

			DataUtils.dataFormatacao = new SimpleDateFormat(
					"yyyy/MM/dd HH:mm:ss");

			Query query = this.sessao.createQuery(sql.toString());

			query.setInteger(0, pAgendamentoTO.getFuncionarioServico().getId());

			query.setString(1, DataUtils.dataFormatacao
					.format(DataUtils.segundosLowValues(pAgendamentoTO
							.getDataEHoraAgendamento())));
			query.setString(2, DataUtils.dataFormatacao.format(DataUtils
					.segundosHighValues(pAgendamentoTO
							.getDataEHoraAgendamento())));

			query.setString(3, DataUtils.dataFormatacao.format(DataUtils
					.segundosLowValues(pAgendamentoTO
							.getHorarioEstimadoEntrega())));
			query.setString(4, DataUtils.dataFormatacao.format(DataUtils
					.segundosHighValues(pAgendamentoTO
							.getHorarioEstimadoEntrega())));

			query.setString(5, DataUtils.dataFormatacao.format(DataUtils
					.segundosHighValues(pAgendamentoTO
							.getDataEHoraAgendamento())));
			query.setString(6, DataUtils.dataFormatacao.format(DataUtils
					.segundosLowValues(pAgendamentoTO
							.getHorarioEstimadoEntrega())));

			lista = (ArrayList<AgendamentoTO>) query.list();

		} catch (Exception e) {
			e.printStackTrace();
			lista = null;
		} finally {
			this.sessao.close();
		}
		return lista;
	}

Pessoal Muito Obrigado!!! Coloquei o banco devia ter feito isto antes!!!