JPA Sempre usando a primeira Query

1 resposta
java
P

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;
}
@PostConstruct
protected 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

1 Resposta

P

Uma nova informação.

Se eu mudar o método findAll() para uma clássica gambiarra funciona.

Antes NÃO FUNCIONANDO estava:

<a class="mention" href="/u/override">@Override</a>

public List findAll() {

List list = em.createQuery(query).getResultList();

return list;

}

Mas se eu fizer como abaixo funciona:

<a class="mention" href="/u/override">@Override</a>

public List findAll() {

TypedQuery typedQuery = em.createQuery(

query.select(root)

.where()

);
return typedQuery.getResultList();

}

Esse where sem nada força um where 1=1 e não utiliza a query do método userAuthentication().

Realmente nao gostaria de deixar assim. Conto com a ajuda de vocÊs.

Criado 6 de novembro de 2016
Ultima resposta 6 de nov. de 2016
Respostas 1
Participantes 1