Besoin d'aide pour créer JPA critères de requête
Je suis en train de construire mon premier Java EE de l'application web à l'aide de Glassfish et JSF. Je suis assez nouveau dans les critères de la requête et j'ai une question j'ai besoin de réaliser, mais le javaee6 tutoriel semble un peu mince sur des exemples. De toute façon, je vais avoir un moment difficile la création de la requête.
But: je tiens à tirer la compagnie avec le plus de documents stockés.
Les entreprises ont une relation OneToMany avec les Documents.
Documents a une relation ManyToOne avec plusieurs tables, la usertype" colonne distingue.
Requête MySQL:
SELECT USERID, COUNT(USERID) AS CNT
FROM DOCUMENTS
WHERE USERTYPE="COMPANY"
GROUP BY USERID
ORDER BY CNT DESC
Grâce
--update--
Basé sur les commentaires des utilisateurs, voici ce que j'ai à ce jour:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Documents> cqry = cb.createQuery(Documents.class);
//Intersting Stuff
Root<Documents> root = cqry.from(Documents.class);
Expression userid = root.get("userID");
Expression usertype = root.get("userType");
Expression count = cb.count(userid);
cqry.multiselect(userid, count);
Predicate userType = cb.equal(usertype, "COMPANY");
cqry.where(userType);
cqry.groupBy(userid);
cqry.orderBy(cb.desc(count));
//more boilerplate
Query qry = em.createQuery(cqry);
List<Documents> results = qry.getResultList();
L'erreur que j'obtiens est:
Exception Description: Partial object queries are not allowed to maintain the cache or be edited. You must use dontMaintainCache().
Erreur typique, ne signifie rien pour moi!
OriginalL'auteur Alan B. Dee | 2012-01-06
Vous devez vous connecter pour publier un commentaire.
Votre requête ne retourne pas une complète objet d'entité que vous êtes seulement à la sélection de deux champs de la table donnée (c'est pourquoi vous obtenez une erreur qui dit yadayadapartialyadayada).
Votre solution est presque droite, voici ce que vous devez modifier pour le faire fonctionner—il partielle.
Au lieu d'une plaine
CriteriaQuery<...>
vous devez créer un tupleCriteriaQuery<..>
en appelantCriteriaBuilder.createTupleQuery()
. (En gros, vous pouvez appelerCriteriaBuilder.createQuery(...)
et passerTuple.class
comme un argument.Tuple
est une sorte de générique classe d'entité.)(d'Accéder à des champs d'une
Tuple
m'a donné une erreur si je n'ai pas utiliser des alias pour eux (dansmultiselect(...)
). C'est pourquoi j'ai utilisé de faux noms, mais cela peut être abordé de façon plus propre en utilisant JPA 2 Méta-modèle de l'API, qui est décrit dans le cahier des charges assez bien. )La documentation pour
CriteriaQuery.multiselect(...)
décrit le comportement des requêtes à l'aide deTuple
des objets de plus en plus profondément.Bonne réponse, a aidé à résoudre mon problème avec l'erreur suivante
You must use dontMaintainCache()
Merci pour votre exemple de code. J'ai appris beaucoup de choses sur jpa critères de requêtes à l'aide de n-uplets (au lieu d'Entités).
Salut, je veux créer un alias pour cb.count(userId) et utiliser cet alias dans la commande subséquente, par référence à l'alias. Est-ce possible?
href="https://en.wikibooks.org/wiki/Java_Persistence/Criteria#Tuple_query_examples" >Vous faites quelque chose comme ceci. Vous définissez l'alias dans le
multiselect
appel.OriginalL'auteur
Si vous êtes en utilisant Hibernate, cela devrait fonctionner:
Espère que cela aide!
oui, je crains que je ne suis pas en utilisant Hibernate. quoique je commence à souhaite que j'étais!
oh, un gros excuses. Je ne savais pas que!
OriginalL'auteur
Prendre un coup d'oeil dans ce simple tutoriel. Il utilise JPA2 et les Critères
http://www.jumpingbean.co.za/blogs/jpa2-criteria-api
Ce qui concerne les!
merci, le tuto m'a beaucoup aidé. Aussi loin que les différents types tous j'ai besoin est l'id (long).
Cool. Heureux, il a aidé. Je l'ai utilisé moi-même, pas trop longtemps.
OriginalL'auteur