2010-06-07 16 views
1

Est-il possible (en utilisant Hibernate et JPA2 Criteria Builder [1]) de classer par résultat d'une méthode plutôt que par membre d'une entité?JPA2 + Hibernate + Ordonner par

 
public class X { 
    protected X() {} 
    public String member; 
    public String getEvaluatedValue() { // order by 
     return "a status calculated with various members"; 
    } 
} 

Ce que je veux obtenir est ordre par le résultat de getEvaluatedValue(). Est-ce possible?

Merci à l'avance.

EDIT: Réponse ajoutée.

Je ne suis pas en utilisant @Formular, mais

 
EntityManager em = ...; 
QueryBuilder builder = em.getQueryBuilder(); 
SomeQueryClass query = builder.createQuery(MyTargetClass.class); 
query.orderBy(builder.asc(... some code...)); 

Je croyais que c'est JPA2 simple et certainement vous avez raison, il n'y a aucune chance de commander des données dynamiques. Mais je peux être autorisé à spécifier un ordre par bloc avec une instruction if-else ou autre (définie avec mon QueryBuilder), n'est-ce pas?

[1] http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html_single/#querycriteria

Répondre

0

Je ne sais pas s'il est possible (si un attribut est transitoire-à-dire ne pas de représentation dans la base de données, ce qui devrait être le résultat SQL?) Mais, plus important encore, quelle serait la différence entre la commande par "some test " + member et member? Peut-être que c'est juste un exemple si ...

+0

Il est bien sûr qu'un exemple. Le problème est que je dois calculer un statut d'événement, qui dépend de divers membres. Parce qu'il est calculé, il n'a pas de sens de le stocker dans la base de données juste à des fins de tri. – Jan

+1

@Jan Oui, je suis d'accord. Mais je ne pense pas que la base de données ferait un bon travail pour trier le résultat de toute façon (à cause du manque d'index). Je vais creuser un peu plus car je crois comprendre que vous utilisez une '@ Formula' et non une version standard JPA2.0 (donc il y a peut-être un mode Hibernate). –

+0

voir le post initial pour réponse – Jan

0

On dirait que cela ne peut pas être possible, pour cette raison: lorsque la requête est exécutée dans la couche SQL, le champ "EvaluatedValue" n'est pas calculé. Il est seulement rempli plus tard (quand exactement, je ne sais pas, cela peut dépendre si l'entité utilise un mode LAZY ou non). L'objet JPA Query est étroitement lié à SQL, c'est-à-dire à ce qui se trouve dans la base de données.

Probablement, je recevrais les résultats non triés avec getResultList(), puis les trier manuellement:

faire votre EvaluatedValue un type qui implémente Comparable: see here