TypedQuery au lieu de la normale de la Requête en JPA
Est-il possible d'écrire cette Requête comme une TypedQuery et laisser les deux Long de la course dans un Objet avec les deux publics à Long champs à l'intérieur.
Query q = em.createQuery(
"SELECT c.id, COUNT(t.id) " +
"FROM PubText t " +
"JOIN t.comm c " +
"WHERE c.element = ?1 " +
"GROUP BY c.id");
q.setParameter(1, e);
List<?> rl = q.getResultList();
Iterator<?> it = rl.iterator();
HashMap<Long, Long> res = new HashMap<Long, Long>();
while (it.hasNext()) {
Object[] n = (Object[]) it.next();
res.put((Long)n[0], (Long)n[1]);
}
return res;
OriginalL'auteur Hasan Tuncay | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
JPA a une fonction simplement pour ce constructeur expressions:
Votre DTO classe peut être un POJO. Tout ce dont nous avons besoin est un constructeur public d'accepter 2
Long
s. Veuillez noter que vous devez fournir un nom pleinement qualifié de la classe après laNEW
opérateur.SELECT NEW com.company.ui.EntityIDKey(c.companyId, c.name) FROM Company c WHERE c.companyId is not null and c.name is not null and length(trim(c.name)) > 0 order by c.name asc
. Je suis à l'aide d'un TypedQuery comme suit:List<EntityIDKey> companies = getEntityManager().createQuery(sql, EntityIDKey.class).getResultList();
cela peut être le cas si votre EntityIDKey n'est pas une entité. Le fournisseur est libre de ne pas soutenir de telles requêtes. Avez-vous essayé d'utiliser une Requête régulière?
c'est vrai,
EntityIDKey
n'est pas une entité. Je suis de l'utilisation d'Hibernate fournisseur et en quelque sorte présumé qu'elle va travailler. Une requête régulière qui construit une collection deCompany
fonctionne très bien.Tant que vous n'avez pas de générer des tables de vos entités (vérifiez votre persistence.xml en cas de doute), vous devez être bien avec de "faux " entités". Cependant, à mon humble avis, la suppression de type d'avertissement est un direct (et donc compréhensible) de traiter la question, tout en simulant des entités est plus une solution de contournement. Si je un plus tard responsable serait de voir une entité sans correspondant à la table, il me faudrait un certain temps pour comprendre le but.
la DTO est probablement pas une entité, vous ne pouvez pas utiliser TypedQuery. Ce n'est pas correct. À partir de docs.oracle.com/javaee/6/api/javax/persistence/... il est permis, où le constructeur de l'expression dans la JSR-317 stipule clairement que: "Un constructeur peut être utilisé dans la liste de sélection pour retourner une instance de la classe Java. La classe spécifiée n'est pas nécessaire d'être une entité ou d'être relié à la base de données. Le constructeur nom doit être complet."
OriginalL'auteur kostja
Nouveau code ressemble à ça maintenant.
Merci pour votre aide.
Map
droit à partir de la requête, de sorte que la transformation de la partie dans les 3 dernières lignes a rester, je le crains.Ach, qui amende. Nous n'avons pas besoin de presser le tout dans une ligne comme dans les vieux C jours. 🙂
pourquoi n'avez-vous pas l'effet de levier le constructeur fonctionnalité d'expression suggéré par @kostja?
Je l'ai fait. J'ai juste ajouté le TypedQuery vérification de type.
OriginalL'auteur Hasan Tuncay