2010-11-22 15 views
2

J'utilise actuellement un critère de mise en veille prolongée pour renvoyer une liste de résultats (filtrage sur diverses valeurs de colonne), mais plusieurs des objets ont la même valeur pour l'un des attributs et J'ai seulement besoin d'un "représentant" pour chacun. Par exemple: On me renvoie une liste de 3 objets de véhicule, avec les clés ID/primaires de 123, 456, 789, et les codes de fabricant de: 111, 111, 222. Je voudrais seulement avoir retourné une liste avec deux objets: 123/111, 789/222.Résultat unique du critère Hibernate (colonne autre que clé)

Existe-t-il un moyen d'ajouter une restriction à un critère de mise en veille prolongée afin de renvoyer uniquement le résultat unique (ou premier) du code du fabricant dans cet exemple? S'il vous plaît laissez-moi savoir si des informations supplémentaires/clarification est nécessaire.

Merci pour vos suggestions!

+0

http://stackoverflow.com/questions/8491796/hibernate-groupe-par-critère-objet Le lien ci-dessus est une bonne réponse pour cela. – Ketan

Répondre

1

L'approche est plus simple à mettre en œuvre un approprié ResultTransformer et l'appliquer à votre requête.

Si vous voulez vraiment à effectuer sur le côté de la base de données, vous avez besoin d'une requête délicate, comme celle-ci (dans HQL/JPQL par souci de concision):

SELECT v FROM Vehicle v 
WHERE v.id = 
    (SELECT MIN(sv.id) FROM Vehicle sv WHERE sv.manufacturerCode = v.manufacturerCode) 
+0

C'est la solution que j'ai utilisée. J'espérais pouvoir le faire du côté DB, mais cela fonctionne bien pour les petits résultats (moins de 10k) généralement récupérés. Merci! –

1

Si vous utilisez JPA avec Hibernate, vous pouvez l'utiliser quelque chose comme ci-dessous:

Query q = em.createQuery("select cat from DomesticCat cat"); 
q.setMaxResults(1); 
List cats = q.getResultList(); //return any one cat from matched rows 

Maintenant, juste obtenir le 1er élément de la liste. BTW, prendre soin de NullPointerException et vérifier la taille de la liste avant de faire toute autre opération.

Sinon, si vous utilisez Hibernate sans JPA. Vous pouvez aller pour le suivant [uniqueResult()]:

Query query =session.createQuery("select ao from AccountOwner ao "); 
AccountOwner ao=query.uniqueResult(); 
+0

Je comprends ce que vous dites, mais cela ne retournera qu'un seul enregistrement. Je voudrais une liste de tous les enregistrements, mais limité à un seul résultat par "fabricant" de mon exemple. –

+1

puis, ne définissez pas le MaxResult/ne pas aller pour UniqueResult, plutôt modifier la requête pour ajouter une clause «group by» pour «fabricant». –

+0

Comment sais-je si j'utilise avec JPA (j'utilise en ce moment hibernate 4.2)? –