Pessoal,
Seguinte.
Tenho um Dao Genérico, assim:
public abstract class GenericDao implements IDao {
@PersistenceContext protected EntityManager em; protected Class<T> clazz; protected CriteriaBuilder builder; protected CriteriaQuery<T> query; protected Root<T> root; public GenericDao(Class<T> clazz){ this.clazz = clazz; }
@PostConstructprotected void criteriaObjects() { this.builder = em.getCriteriaBuilder(); this.query = builder.createQuery(clazz); this.root = query.from(clazz); }@Override
public T findById(int id) {TypedQuery<T> typedQuery = em.createQuery( query.select(root) .where(builder.equal(root.get("id"), id)) ); T t = typedQuery.getSingleResult(); return t;}
<a class="mention" href="/u/override">@Override</a> public void updateObject(T object) { em.merge(object); }<a class="mention" href="/u/override">@Override</a> public List findAll() { List list = em.createQuery(query).getResultList(); return list; } }
No meu método de autenticação, eu utilizo o UserDao estendendo o GenericDao, assim
@Repository
public class UserDao extends GenericDao {
public UserDao() { super(User.class); }
public User userAuthentication(String login, String password) throws NoResultException{ TypedQuery q = em.createQuery( query.select(root) .where(builder.and( builder.equal(root.get(“login”), login), builder.equal(root.get(“password”), password) ) ) );User user = q.getSingleResult(); return user;}
public User findByEmail(String email) throws NoResultException{ TypedQuery q = em.createQuery( query.select(root) .where(builder.equal(root.get(“email”), email) ) );User user = q.getSingleResult(); return user;}
}
Ai estou encontrando o seguinte problema.
Se eu acessar DIRETAMENTE uma página que utiliza o método findaAll(), blz… tras todos os registros. Mas se eu logar primeiro (vai utilizar o metodo userAuthentication) e depois acessar a pagina que utiliza o findAll(), a query utilizada é a do método userAuthentication e não o findAll(), mesmo eu chamando o método findAll(). Sei lá, parece que a query está presa!
Ai fiz um teste, copiei as linhas que estão no @PostConstruct protected void criteriaObjects() e forçei dentro do método findAll(). Ai funciona corretamente.
@Override
public List findAll() {this.builder = em.getCriteriaBuilder(); this.query = builder.createQuery(clazz); this.root = query.from(clazz);
Não sei onde estou errando