2009-03-06 6 views
2

Je travaille maintenant depuis un moment sur une application de reporting où j'utilise hibernate pour définir mes requêtes. Cependant, de plus en plus, j'ai l'impression que ce n'est pas la meilleure approche pour signaler des cas d'utilisation.Meilleure façon d'utiliser Hibernate pour des requêtes complexes comme le top n par groupe

1) Les requêtes ne donnent que des colonnes partielles, donc pas d'objets typés (à moins que vous ne lanciez tous les champs en java). 2) Il est difficile d'exprimer des requêtes sans aller directement dans sql ou hql.

Mon problème actuel est que je veux obtenir le top N par groupe, par exemple les 5 derniers jours par élément dans un groupe, où chaque jour j'affiche le nombre de visiteurs.

Le résultat devrait ressembler à:

| RowName | 1-1-2009 | 2-1-2009 | 3-1-2009 | 4-1-2009 | 5-1-2009 
| SomeName| 1  | 42  | 34  | 32  | 35 

Quelle est la meilleure approche pour transformer les données qui sont stockées par jour par ligne à une sortie comme ça? Est-il temps de revenir sur sql régulière et de travailler avec des données non typées? Je veux vraiment utiliser des objets typés pour mes résultats, mais Java rend ma vie très difficile pour cela. Toutes les suggestions sont les bienvenues!

Répondre

1

Utilisation de l'API de critères, vous pouvez le faire:

Session session = ...; 
Criteria criteria = session.createCriteria(MyClass.class); 
criteria.setFirstResult(1); 
criteria.setMaxResults(5); 
... any other criteria ... 
List topFive = criteria.list(); 

Pour ce faire, dans SQL vanille (et pour confirmer que Hibernate fait ce que vous attendez) Vérifions this SO post:

+2

C'est en effet supérieure 5, mais pas par groupe comme clairement mentionné dans ma question ... – TomHastjarjanto

+0

Votre exemple ne précise pas si les lignes de données sont par date, puis vous faites pivoter leurs agrégations en colonnes? Si c'est le cas, vous pouvez faire les sommations dans Hibernate en utilisant une ProjectionList et une projection 'sum', puis faites le pivot dans votre application. –

Questions connexes