DISTINCT não funciona JPA/JPQL

Como faço para usar o distinct ??’

Método

Não manjo de JPQL, mas para este caso acredito que se aplica o que é válido para SQL… para que te retornem somente registros distintos, você precisa especificar quais campos quer obter no resultado. Porque do jeito que a query está escrita, retornarão todos os campos da tabela. Supondo que ela tenha 10 campos, e em dois registros por exemplo os 9 primeiros tenham valores repetidos, somente no décimo haja valores diferentes… precisaria escrever a query somente com os 9 primeiros campos.

Preciso especificar os campos?

Se eu estivesse com o mesmo problema que você, conhecendo o que eu conheço de SQL, deduziria isto. Mas veja que eu disse no começo… não conheço JPQL. Ainda faço fogo usando pedras de jdbc bruto.

SELECT DISTINCT(u.atributo_para_realizar_distinct) FROM Usuario u

Você tem que especificar qual atributo você quer que seja único. Não faz sentido utilizar a primary key, pois já é única. Pode utilizar algo como nome ou email (no caso de usuário).

OK vou testar amigo.

value="#{lancamento.idlancamentoCtLancamento.idlancamento}": The class ‘java.lang.Integer’ does not have the property ‘idlancamentoCtLancamento’.

Está dando esse erro, estou ver o q é.

Pode postar a query inteira? Você tá tentando aparencentente acessar a propriedade idlancamentoCtLancamento em um número inteiro lancamento. Você tem que colocar no distinct a propriedade do objeto raiz da query que quer que seja distinta.

Por exemplo, se você tem uma entidade Lançamento com os campos id, nome e data, você pode fazer o seguinte:

SELECT DISTINCT(lanc.data) FROM Lançamento lanc

Essa query te devolve os lançamentos com datas diferentes. Se há mais de 1 lançamento com a mesma data, nesse caso, apenas 1 será retornado.

public List lista() {

TypedQuery query;
query = em.createQuery("SELECT DISTINCT(c.idlancamentoCtLancamento.idlancamento) FROM CtLancamentoconta c ", CtLancamentoconta.class);

     List<CtLancamentoconta> results = query.getResultList();
    
     System.out.print(results);
      
    if (results.isEmpty()) {
        return null;
    }
    return results;
 }

A classe CtLancamentoConta tem um atributo idLancamentoCtLancamento, certo? Qual o tipo desse atributo? Tenta fazer algo como

SELECT DISTINCT(c.<atributo para distinguir>) FROM CtLancamentoconta c

ilustre, o idLancamentoCtLancamento faz referência a classe Lançamento que tem relação com a classe LançamentoConta, eu quero restringir em função do dlancamentoCtLancamento.idlancamento nota que a partir do objecto dlancamentoCtLancamento eu pego o seu id idlancamento

Vou tentar fazer isso.

Então você tem a classe LancamentoConta, que tem um @OneToMany para Lancamento e quer fazer o distinct em um atributo do Lancamento? Desculpe, não consegui entender a relação entre as classes.

javax.el.PropertyNotFoundException: The class ‘edu.ucan.sighp.entity.ct.CtLancamento’ does not have the property ‘idlancamentoCtLancamento’.

SELECT DISTINCT(c.idlancamentoCtLancamento) FROM CtLancamentoconta c

Sim, é isso ilustre.

Este elemento está repetido… quero trazer apenas um deles.

Eu juro que to tentando entender kkkkk Eu ainda não compreendi a estrutura de classes o que exatamente você quer buscar no banco.

Parece que existe uma classe que possui uma coleção de lançamentos. Cada lançamento, dentro dessa coleção, possui um “alvo”, o diário daquele lançamento, isso?

Por exemplo:

Lancamentos tem uma List dentro dela, contendo:

id    diario
1        1
2        1

Você quer que apareça o lançamento no diário 1 apenas uma vez, para essa entidade Lancamentos?

Você pode fazer o seguinte também:

SELECT DISTINCT(lancamento.diario) lancamento FROM Lancamentos lancamentos 
INNER JOIN Lancamento lancamento;

Essa query vai retornar uma List<Lancamento> com diários distintos, para todos os conjuntos de lançamentos.

Por exemplo, se você tem o conjunto de Lançamentos A com 2 lançamentos dentro, apontando pros diários 1, 1 e 2, e um outro conjunto de Lançamentos B, apontando pros diários 1 e 3, essa query irá retornar os Lancamentos pros diários 1, 2 e 3 (sem duplicar o 1).

Se você quer os lancamentos distintos de um conjunto de lançamentos específico, você pode fazer:

SELECT DISTINCT(lancamento.diario) lancamento FROM Lancamentos lancamentos 
INNER JOIN Lancamento lancamento WHERE lancamentos.id = :id;

e informar parâmetro o id pra query. Seguindo o mesmo exemplo anterior, se o ID for o do Lançamentos A, só vai vir 2 elementos na List<Lancamento>, os que contem os diários 1 e 2 (o 1 aparece só uma vez).

Calma, vou tentar te fazer entender…