Критерий спящего режима: как упорядочить по двум столбцам конкатенированным?

У меня есть таблица Person, которая имеет два столбца: first_name и last_name. Класс Person имеет два соответствующих поля: firstName и lastName. Теперь я использую критерии api и пытаюсь создать порядок, основываясь на этих двух столбцах, конкатенированных. Является ли это возможным? Или это может быть достигнуто только посредством hql?

Ответы

Ответ 1

Здесь приведен пример для сайта спящего режима JBoss:

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

Или с того же сайта, для Criteria api:

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

Они, похоже, очень любят кошек в JBoss.

Ответ 2

У меня была такая же проблема и критерии api orderBy метод не будет работать с конкатенированными столбцами. Мне нужно было это использовать с методом criteriaBuilder.construct(). Я решил это, расширив класс Orale10gDialect и зарегистрировав пользовательскую функцию:

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

}

И затем:

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

...

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

Конечно, вы также должны выбрать эти конкатенированные столбцы.