2010-09-21 17 views
7

Si j'ai un @OrderBy (« someProperty ») annotation sur un objet, puis sur un critère d'ajouter une clause ORDER BY comme ceci:Est-il possible de supprimer l'ordre des critères Hibernate?

criteria.addOrder(Order.asc("id")); 

Le SQL résultant fera la commande comme ceci:

ORDER BY someProperty, id asc 

Est-il possible de changer l'ordre des deux ou de supprimer la commande someProperty? Je ne peux pas supprimer l'annotation @OrderBy et j'utilise Hibernate pour Java.

+0

J'ai la même question ... nous utilisons Hibernate 3.2.6 ... aimerions pouvoir "surcharger" l'annotation @OrderBy lors de l'utilisation de projections. Est-ce que quelqu'un sait à propos de cela? Y a-t-il un moyen de le changer à la volée? Modifier l'ordre des commandes ou supprimer la clause @OrderBy tous ensemble? Merci! –

+0

J'ai le même problème avec Hibernate 3.6.4, que j'ai réduit à l'implémentation (buggé) de org.hibernate.loader.JoinWalker # orderBy (associations de la liste finale, final orderBy) à la ligne 820. I crois qu'il y a un bug sur cette ligne, puisque OrderBy sur les associations est fusionné avant l'ordre spécifié sur les critères. Pensez-y: si j'ai spécifié une commande désirée dans un critère ayant des éléments comme entité racine, Hibernate devrait-il placer d'abord le OrderBy spécifié sur les enchères associées? –

Répondre

1

Criteria n'a pas de méthode pour le retrait de la classe Order ni Criterion Order est très limitée, vous ne pouvez utiliser les noms de propriétés et il génère SQL standard et portable. OrderBy L'annotation est un ordre SQL, comme le stipule javadoc: OrderBy Cela signifie que vous pouvez utiliser n'importe quel SQL (même exclusif de votre fournisseur de base de données). Jetez un oeil à ces article: Sorting Collections in Hibernate Using SQL in @OrderBy

Ajouter un fragment SQL dans votre classe de domaine n'est pas nécessairement la chose la plus élégante au monde, mais c'est peut-être la chose la plus pragmatique.

1

Il peut être possible de supprimer un ordre particulier via l'itérateur criteria.iterateOrderings(), mais je ne suis pas sûr de savoir comment cela fonctionne avec les annotations.