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…