Ae pessoal, estou começando com JPA e já senti um problema quanto a usar fazer selects usando queries e namedqueries…
Um exemplo:
Query query = entityManager.createNamedQuery("ProcuraPorNome");
List listaAutor = query.setParameter("nome", "Rachel de Queiroz").getResultList();
Nesse código eu teria que usar o List sem genérico o que gera um warning e assim teria que colocar um @SuppressWarnings(“unchecked”) da vida…
Mas isso seria só aqui… imagine em várias de minhas classes esses supress… eu odiaria isso. Fora que isso poderia encobrir um outro warning gerado desnecessariamente…
Eu procurei por soluções na net falando de DAO generico… mas por enquanto meu problema eh so com essa interface Query…
Eu criei uma classe QueryGenerico implements Query pra resolver o meu problema. Pra usar eu faço assim:
Query query = ... pego a query não generica
QueryGenerica<ContaCorrente> queryG = new QueryGenerica<ContaCorrente>(query); // passando a query nao generica no construtor.
E então todos os @SupressWarnings que deveria ter em milhares de classes se resumem à 2 miseros @SuppressWarnings que ficam na classe QueryGenerica. É claro que se o programador for jumento ele pode definir um tipo T que não vai ser o retorno esperado…
Então eu queria saber de vocês se alguem ja fez isso, e se isso não é nenhum pouco recomendado e se tem alguma outra maneira de resolver isso sem ter mto trabalho.
Vlw!
Aqui embaixo tem o codigo de uma aplicação rodando sem warnings…
Aqui vai o codigo da classe QueryGenerica:
package com.livraria.jpa;
public class QueryGeneric<T> implements Query {
private Query query;
public QueryGeneric(Query query) {
this.query = query;
}
@Override
public int executeUpdate() {
return query.executeUpdate();
}
@SuppressWarnings("unchecked")
@Override
public List<T> getResultList() {
return (List<T>)query.getResultList();
}
@SuppressWarnings("unchecked")
@Override
public T getSingleResult() {
return (T)query.getSingleResult();
}
@Override
public QueryGeneric<T> setFirstResult(int startPosition) {
return new QueryGeneric<T>(query.setFirstResult(startPosition));
}
@Override
public QueryGeneric<T> setFlushMode(FlushModeType flushMode) {
return new QueryGeneric<T>(query.setFlushMode(flushMode));
}
@Override
public QueryGeneric<T> setHint(String hintName, Object value) {
return new QueryGeneric<T>(query.setHint(hintName, value));
}
@Override
public QueryGeneric<T> setMaxResults(int maxResult) {
return new QueryGeneric<T>(query.setMaxResults(maxResult));
}
@Override
public QueryGeneric<T> setParameter(String name, Object value) {
return new QueryGeneric<T>(query.setParameter(name, value));
}
@Override
public QueryGeneric<T> setParameter(int position, Object value) {
return new QueryGeneric<T>(query.setParameter(position, value));
}
@Override
public QueryGeneric<T> setParameter(String name, Date value,
TemporalType temporalType) {
return new QueryGeneric<T>(query.setParameter(name, value, temporalType));
}
@Override
public QueryGeneric<T> setParameter(String name, Calendar value,
TemporalType temporalType) {
return new QueryGeneric<T>(query.setParameter(name, value, temporalType));
}
@Override
public QueryGeneric<T> setParameter(int position, Date value,
TemporalType temporalType) {
return new QueryGeneric<T>(query.setParameter(position, value, temporalType));
}
@Override
public QueryGeneric<T> setParameter(int position, Calendar value,
TemporalType temporalType) {
return new QueryGeneric<T>(query.setParameter(position, value, temporalType));
}
}
E aqui um codigo de exemplo usando esse novo “artificio”:
*A classe Autor é um POJO/Entidade com uma NamedQuery pra procurar por nome…
public class Teste {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Livraria");
EntityManager entityManager = entityManagerFactory.createEntityManager();
List<Autor> lista;
QueryGeneric<Autor> queryGeneric;
Query query;
query = entityManager.createNamedQuery(Autor.NamedQueries.ProcuraPorNome.toString());
queryGeneric = new QueryGeneric<Autor>(query);
lista = queryGeneric.setParameter("nome", "Rachel de Queiroz").getResultList();
for (Autor autor : lista)
System.out.println(autor.toString());
entityManager.close();
entityManagerFactory.close();
}
}
Mas diz respeito a Genericos: