Sou bastante novo no JPA 2 e em sua API CriteriaBuilder / CriteriaQuery:
CriteriaQuery
no tutorial Java EE 6
Eu gostaria de contar os resultados de um CriteriaQuery sem realmente recuperá-los. Isso é possível, não encontrei tal método, a única maneira seria fazer isso:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
E essa não pode ser a maneira correta de fazer isso ...
Há uma solução?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
fonte
fonte
Respostas:
Uma consulta do tipo
MyEntity
vai retornarMyEntity
. Você quer uma consulta para umLong
.Obviamente, você desejará construir sua expressão com quaisquer restrições e agrupamentos, etc, que você ignorou no exemplo.
fonte
qb.count
é feito sobre aRoot<MyEntity>
sua consulta (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) e isso geralmente já está em seu código de seleção normal e quando você se esquece, termina com uma junção a self.Eu resolvi isso usando o cb.createQuery () (sem o parâmetro de tipo de resultado):
Espero que ajude :)
fonte
fonte
Como outras respostas estão corretas, mas muito simples, para completar, estou apresentando abaixo o trecho de código para executar
SELECT COUNT
em um sofisticado consulta de critérios JPA (com várias junções, buscas, condições).É ligeiramente modificado esta resposta .
Espero que economize o tempo de alguém.
Porque IMHO JPA Criteria API não é intuitiva nem totalmente legível.
fonte
recursion on databases
? Eu estava falando sobre recursão no nível da API. Não confunda esses conceitos :-) JPA vem com uma API muito poderosa / complexa que permite que você faça várias junções / buscas / agregações / aliases etc em uma única consulta. Você tem que lidar com isso enquanto conta.É um pouco complicado, dependendo da implementação JPA 2 que você usa, este funciona para EclipseLink 2.4.1, mas não para Hibernate, aqui uma contagem de CriteriaQuery genérica para EclipseLink:
Outro dia eu migrei do EclipseLink para o Hibernate e tive que mudar minha função de contagem para a seguinte, então sinta-se à vontade para usar, pois este é um problema difícil de resolver, pode não funcionar para o seu caso, está em uso desde o Hibernate 4.x, observe que não tento adivinhar qual é a raiz, em vez disso, passo a partir da consulta para que o problema seja resolvido, muitos casos ambíguos para tentar adivinhar:
fonte
Você também pode usar as projeções:
fonte
Com Spring Data Jpa, podemos usar este método:
fonte