Organização de consultas com @NamedQueries - críticas ao meu modo?

Boa tarde pessoal! Na sequência vou postar um modo de organização de código onde é realizado uma consulta simples com Glassfish… se alguém tiver sujestões ou críticas, por favor, fiquem à vontade.
É utilizado o padrão Facade para este exemplo…

Está e a Entidade, onde ficam os atributos, também constantes com os nomes dos paramentos ja definidos, assim evitando erros de escrita e as próprias queries de consulta:

@Entity
@Table(name = "nome_tabela")
@NamedQueries({
    @NamedQuery(name = NomeEntidade.qNOME_QUERY,
            query = " SELECT e FROM EntidadeTeste e "
            + " WHERE e.atributo1 = :" + EntidadeTeste.pATRIBUTO1 + " AND e.atributo2 = :" + EntidadeTeste.pATRIBUTO2 + ""
            + " ORDER BY e.atributo3 DESC "))

public class EntidadeTeste {

     //constantes gerais
     public static final String qNOME_QUERY = "EntidadeTeste.MelhorNomeParaSuaConsulta";
     public static final String pATRIBUTO1 = "pAtributo1";
     public static final String pATRIBUTO2 = "pAtributo2";

     // mapeamento jpa
     @JoinColumn(name = "fk_de_outra_entidade", nullable = false)
     @ManyToOne
     private OutraEntidade atributo1;
     @Column
     private String atributo2;
     @Column
     private String atributo3;

     // GETTERS AND SETTERS
     ...
}

(mas porque colocou na entidade as queries?) --> eu acho muito bacana a ideia como o JPA trata suas referencias, utilizado Annotation @NamedQueries… na sequência mostrarei como é possível organizar mais ainda o código, e utilizar as queries:

@Stateless
public class EntidadeTesteFacade extends AbstractFacade<EntidadeTeste> {

     public EntidadeTeste nomeDoSeuMetodo(EntidadeTeste entidadeTeste) {
          TypedQuery<EntidadeTeste> q = getEntityManager().createNamedQuery(EntidadeTeste.qNOME_QUERY, EntidadeTeste.class);
          q.setParameter(EntidadeTeste.pATRIBUTO1, entidadeTeste.getAtributo1());
          q.setParameter(EntidadeTeste.pATRIBUTO2, entidadeTeste.getAtributo2());
          return q.getSingleResult();
     }
}

então nessa classe EntidadeTesteFacade é realmente onde fica o método que fará o retorno do resultado obtido pelo Glassfish, sendo este podendo ser utilizado em um Controller qualquer, para posteriormente os resultados serem atribuídos a uma tela .xhtml por exemplo.

Não coloquei muito detalhes, afinal este código é para quem conhece como funciona o Java, mas qualquer dúvida, poste ai que repondo quando puder :wink:

[]'s \o/

Só uma questão, colocando como abaixo:

     public static final String pATRIBUTO1 = "pAtributo1";  
     public static final String pATRIBUTO2 = "pAtributo2";  

Como você vai popular esses atributos?

[quote=guilherme_costa]Só uma questão, colocando como abaixo:

     public static final String pATRIBUTO1 = "pAtributo1";  
     public static final String pATRIBUTO2 = "pAtributo2";  

Como você vai popular esses atributos?[/quote]

é simples meu caro, na verdade eles propositalmente ja estão definidos com valor ai para evitar erros de escrita quando a CONSTANTE foi chamada…
…eles servem apenar como um nome que faz referência ao parametro da consulta… observe na classe EntidadeTesteFacade, lá é chamado assim:

q.setParameter(EntidadeTeste.pATRIBUTO1, entidadeTeste.getAtributo1());  
q.setParameter(EntidadeTeste.pATRIBUTO2, entidadeTeste.getAtributo2()); 

que seria isso:


//entidadeTeste.getAtributo1() - o valor do parametro é obtido com este GETTER do objeto entidadeTeste
//entidadeTeste.getAtributo2() - o valor do parametro é obtido com este GETTER do objeto entidadeTeste

q.setParameter("pAtributo1", entidadeTeste.getAtributo1());  
q.setParameter("pAtributo2", entidadeTeste.getAtributo2()); 

// estes valores serão alimentados no objeto no decorrer do seu código, então ja passa um objeto pronto para a consulta...