Olá pessoal,
estou tentando fazer uma pesquisa por nome no meu sistema, mas não estou conseguindo.
Tentei usar Criteria e HQL, mas os dois não funcionam: [code]public class PessoaFisicaDao extends Dao{
private Session session;
public PessoaFisicaDao(Session session, Class<?> classe) {
super(session, classe);
}
public List<PessoaFisica> pesquisaPessoasFisicasByName(String nome){
Criteria c = session.createCriteria(PessoaFisica.class);
c.add(Restrictions.ilike("nome", nome));
c.addOrder(Order.asc("nome"));
c.setProjection(Projections.property("nome"));
return c.list();
}
public List pesquisaPessoasFisicasByName(String nome){
Query q = session.createQuery(“select f from " + PessoaFisica.class.getName() + " as f where f.nome like :nome”);
q.setParameter(“nome”, nome);
List<PessoaFisica> lista = q.list();
return lista;
…
}[/code]Segue o DAO: [code]public class Dao {
private static Logger logger = Logger.getLogger(Dao.class);
private Class persistentClass;
private Session session;
public Dao(Session session, Class persistentClass) {
this.session = session;
this.persistentClass = persistentClass;
}
@SuppressWarnings("unchecked")
public T load(Long id) {
logger.info("lendo " + persistentClass + " com id " + id);
return (T) session.load(persistentClass, id);
}
public void save(T t) {
logger.info("salvando " + t);
session.save(t);
}
public void delete(T t) {
logger.info("Deletando " + t);
session.delete(t);
}
@SuppressWarnings("unchecked")
public List<T> list() {
logger.info("Listando todos");
return session.createCriteria(persistentClass).list();
}
public void merge(T t) {
logger.info("Salvando ou atualizando " + t);
session.merge(t);
}
}[/code]
Meu teste: [code] Session session = HibernateUtil.openSession();
PessoaFisicaDao dao = new PessoaFisicaDao(session, PessoaFisica.class);
List<PessoaFisica> fisicas = dao.pesquisaPessoasFisicasByName("%Maria");
System.out.println(fisicas);[/code]
Erro: [quote]javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getNameParser(Unknown Source)
at org.hibernate.util.NamingHelper.bind(NamingHelper.java:75)
at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113)
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:338)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at br.com.dao.HibernateUtil.(HibernateUtil.java:17)
at br.com.test.PessoaFisicaTest.main(PessoaFisicaTest.java:79)
Exception in thread “main” java.lang.NullPointerException
at br.com.dao.PessoaFisicaDao.pesquisaPessoasFisicasByName(PessoaFisicaDao.java:53)
at br.com.test.PessoaFisicaTest.main(PessoaFisicaTest.java:82)[/quote]
Quando eu faço uma pesquisa normal, do tipo: [code] Session session = HibernateUtil.openSession();
PessoaFisicaDao dao = new PessoaFisicaDao(session, PessoaFisica.class);
System.out.println(dao.load(1l));[/code] ... funciona!
Onde estou errando?