Estou criando uma DAO genérico utilizando o Hibernate 4.1
Gostaria de saber como eu posso criar uma busca em cima de um Objeto, que eu chamei de findByExample (Não estou usando Spring).
[HibernateUtil]
publicclassHibernateUtil{privatestaticSessionFactorysessionFactory;//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)publicSessionFactorysetUp(){returnnewConfiguration().configure().buildSessionFactory();}//Obtem a SessionFactorypublicSessionFactorygetSessionFactory(){returnthis.sessionFactory=setUp();}}
[AbstractDAO]
publicabstractclassAbstractDAO<T>{privateClassclasse;privateSessionsession;publicAbstractDAO(){this.classe=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];setSession(newHibernateUtil().getSessionFactory());}publicvoidsetSession(SessionFactorysf){this.session=sf.openSession();}publicvoidsave(Tt){this.session.beginTransaction();this.session.save(t);this.session.close();}publicvoiddelete(Tt){this.session.beginTransaction();this.session.delete(t);this.session.close();}publicvoidalter(Tt){this.session.beginTransaction();this.session.update(t);this.session.close();}publicList<T>findAll(Tt){this.session.beginTransaction();returnthis.session.createCriteria(this.classe).list();}//Como implementar esta busca?publicList<T>findByExample(Tt){this.session.beginTransaction();}}
Uma dúvida que gerou agora, se reparar no meu método findAll eu não implementei o this.session.close(). Isto pode gerar algum problema mais grave?
Obrigado pela resposta.
fbl.lucas
Primeiramente, você não precisa abrir uma transação em consultas. Em segundo lugar você só precisa de uma instância de sessionFactory.
publicclassHibernateUtil{privatestaticfinalSessionFactorysessionFactory;//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)static{this.sessionFactory=newConfiguration().configure().buildSessionFactory();}//Obtem a SessionpublicstaticSessiongetSession(){returnthis.sessionFactory.openSession();}}
publicabstractclassAbstractDAO<T>{privateClassclasse;privateSessionsession;publicAbstractDAO(){this.classe=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];}protectedSessiongetSession(){if(this.session==null||!this.session.isOpen()){this.session=HibernateUtil.getSession();}returnthis.session;}publicvoidsave(Tt){getSession().beginTransaction();getSession().save(t);getSession().close();}publicvoiddelete(Tt){getSession().beginTransaction();getSession().delete(t);getSession().close();}publicvoidalter(Tt){getSession().beginTransaction();getSession().update(t);getSession().close();}publicList<T>findAll(Tt){returngetSession().createCriteria(this.classe).list();}/** * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo * com o exemplo passado. * * @param filtro * @param matchMode * @param ignoreCase * @return lista */publicList<T>findByExample(Tfiltro,MatchModematchMode,booleanignoreCase){org.hibernate.criterion.Exampleexample=org.hibernate.criterion.Example.create(filtro);if(matchMode!=null){example=example.enableLike(matchMode);}if(ignoreCase){example=example.ignoreCase();}returngetSession().createCriteria(this.classe).add(example).list();}}
edu_fernandes
Entendi.
Agora uma dúvida aqui quanto ao Reflection.
Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.
Como reverter isto e pegar apenas a classe, sem seu caminho?
fbl.lucas
edu_fernandes:
Entendi.
Agora uma dúvida aqui quanto ao Reflection.
Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.
Como reverter isto e pegar apenas a classe, sem seu caminho?
Como assim cara, não entendi o que você esta fazendo e pq? como assim pegando a classe no genericDao? Coloca o código ai…
edu_fernandes
Ao pegar o classe ele me traz o pacote junto.
Ex.:
packagetestepublicclassMinhaClasse
No AbstractDAO, quando vou realizar uma busca, o SQL está dando erro pois ele está trazendo teste.MinhaClasse e atribuindo a minha Class classe
WRYEL
o método é Class.getSimpleName(). Cuidado com métodos de busca genérico, tenha em mente os limites que você quer, senão, você dará milhões de voltas, e não chegará onde se deseja =p