Consultar por JPA

Eu já trabalhei em sistemas onde o comportamento era parecido.
Não havia uma definição explícita de qual namedquery era executada.
Por isso suponho que seja o caso.
De qualquer maneira, o ideal é vir do ponto onde a query é executada até onde ela é chamada. Identificando isso, você consegue substituir a chamada de acordo com o que precisa.
Talvez, debugar ajude.

1 curtida

Eu já debuguei essa parte do código, ele não entra na parte da NamedQuery para mostrar exatamente onde é chamada.

Mas obrigado pelo tempo e pelo esforço.

Mas ele não vai entrar no namedquery, ele vai ir até onde faz a chamada, afinal, a namedquery é apenas uma referência que é utilizada para “facilitar” as coisas.

cq.select(cq.from(entityClass));

A chamada é exatamente aqui.
Porém não é passado qual namedQuery é chamada.

E esse cara está em qual método? quem chama o método onde essa linha se encontra? Debugar é uma tarefa em que é preciso ser sagaz e ir além do óbvio.
Por estas razões que eu acho que geradores de código são uma besteira enorme. Fazer na mão é muito mais seguro.

Este findByDataGroup() fui eu quem criou baseado no findAll(), por isso acho que o entityClass está retornando o named findAll, porém não sei como passar exatamente o que eu quero.

public List<String> findByDataGroup() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

O controller da classe.

@PostConstruct
    public void inicializarListaData() {
        listaDatas = ejbFacade.findByDataGroup();
    }

Eu fui debugando muitas partes do código para entender onde era feito isso, porém ao chegar ai não me levar a nenhuma outra parte do código, apenas a classes próprias do java e imports, por isso eu fiquei sem saída e resolvi vir aqui.

Como me explica uma query sendo executada fazendo buscas na tabela META_BASE_ATIVOS quando a tabela em questão está mapeada assim:

@Table(name = "PARCIAIS_EDES_IMOBILIZADAS")

Com o debug acionado, você é capaz de conseguir identificar qual é a classe da qual o objeto entityClass é obtido.

Eu havia copiado a linha errada, repare que poucos segundos depois eu editei e coloquei a certa.

Isso que está sendo retornado:

SELECT ID, DATA, DATA_INICIO, DATA_STATUS_CONC, DESCRICAO, ODEX, VALOR, VALOR_OBRIG_ESPC, CR FROM PARCIAIS_EDES_IMOBILIZADAS

Agora faz sentido.
De qualquer forma, quando você tem estas linhas:

javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();

Você está chamando o findAll.
Para utilizar o namedQuery, altere para:

//javax.persistence.TypedQuery
TypedQuery <Country> query = em.createNamedQuery("Country.findAll", Country.class);
List<Country> results = query.getResultList();
1 curtida

Apesar de não conseguir fazer funcionar no projeto, por conta de ter que deixar tudo abstrato para funcionar para todas as classes, eu entendi como funciona.

Obrigado,

Você ainda pode abstrair isso, é uma questão de como vai fazer.
Veja, você tem métodos que podem receber uma String com o nome da namedquery e executar sem muitas dificuldades.

public Collection<T> executaNamedQuery(String nameOfNamedQuery, Class<T> clazz) {
    TypedQuery <T> query = em.createNamedQuery(nameOfNamedQuery, clazz);
    List<T> results = query.getResultList();
    return results;
}

Mais claro?

1 curtida

Cara muito obrigado.

Consegui resolver dessa forma:

public List<String> findByDataGroup() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass).get("data"));
        cq.distinct(true);
        return getEntityManager().createQuery(cq).getResultList();
    }

Retorna exatamente o que eu precisava.
Consegui entender agora como fazer para extrair somente um atributo da tabela, agora irá ficar mais fácil para todas as consultar.