web-dev-qa-db-fra.com

Critères d'Hibernate: comment ordonner par deux colonnes concaténées?

J'ai une table de personne qui a deux colonnes: first_name et last_name. La classe Person a deux champs correspondants: firstName et lastName. Maintenant, j'utilise des critères api et j'essaie de créer un ordre en fonction de ces deux colonnes concaténées. C'est possible? Ou cela ne peut être atteint que par hql?

17
Georgie Porgie

Voici un exemple pour le JBoss hibernate site :

from DomesticCat cat order by cat.name asc, cat.weight desc, cat.birthdate

Ou sur le même site Web, pour le Criteria api :

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();

Ils semblent aimer beaucoup les chats chez JBoss.

25
toto2

J'ai eu le même problème et la méthode des critères api orderBy ne fonctionnera pas avec les colonnes concaténées. J'avais besoin de cela avec la méthode critèreBuilder.construct (). J'ai résolu ce problème en étendant la classe Orale10gDialect et en enregistrant une fonction personnalisée:

import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;

public class CustomOracle10gDialect extends Oracle10gDialect {

    public CustomOracle10gDialect() {
        super();

        // This must be used due to bug in Hibernate (orderBy won't work with concat)
        registerFunction("concatwithspace", new SQLFunctionTemplate(StandardBasicTypes.STRING, "?1 || ' ' || ?2"));
    }

}

Et alors:

Expression<String> user = cb.function("concatwithspace", String.class, criteriaRoot.get("firstname"), criteriaRoot.get("lastname")); 

...

criteriaQuery.orderBy(cb.asc(user));

Bien entendu, vous devez également sélectionner ces colonnes concaténées.

0
KamilJ