Критерий спящего режима: как упорядочить по двум столбцам конкатенированным?
У меня есть таблица 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));
Конечно, вы также должны выбрать эти конкатенированные столбцы.