wake-up-neo.com

Kriterien für den Ruhezustand: Wie ordne ich nach zwei verketteten Spalten?

Ich habe eine Personentabelle mit zwei Spalten: Vorname und Nachname. Die Person-Klasse verfügt über zwei entsprechende Felder: Vorname und Nachname. Jetzt verwende ich Kriterien-API und versuche, eine Reihenfolge zu erstellen, indem ich auf diesen beiden verketteten Spalten aufbaue. Ist es möglich? Oder kann es nur durch hql erreicht werden?

17
Georgie Porgie

Hier ein Beispiel für die JBoss-Hibernate-Site :

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

Oder von derselben Website für die Criteria api :

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

Sie scheinen Katzen sehr gern bei JBoss zu haben.

25
toto2

Ich hatte das gleiche Problem und die Kriterien der Methode api orderBy funktionieren nicht mit verketteten Spalten. Ich brauchte dies, um es mit der Methode parametersBuilder.construct () zu verwenden. Ich habe das Problem gelöst, indem ich die Orale10gDialect-Klasse erweitert und die benutzerdefinierte Funktion registriert habe:

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"));
    }

}

Und dann:

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

...

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

Natürlich müssen Sie auch diese verketteten Spalten auswählen.

0
KamilJ