Критерии гибернации: как сделать заказ по двум объединенным столбцам? - PullRequest
18 голосов
/ 20 июля 2011

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

Ответы [ 2 ]

25 голосов
/ 20 июля 2011

Вот пример для спящего сайта JBoss :

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

Или с того же сайта, для Критерии API :

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

Кажется, они очень любят кошек в JBoss.

0 голосов
/ 07 ноября 2017

У меня была та же проблема и критерии api orderBy метод не будет работать с объединенными столбцами. Мне нужно было это использовать с методом attributeBuilder.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));

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

...