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!!!