Hibernate标准:如何按两列连接排序



我有一个Person表,它有两列:first_name和last_name。Person类有两个相应的字段:firstName和lastName。现在我正在使用criteria api,并尝试基于这两列连接创建一个订单。这可能吗?还是只能通过hql实现?

下面是JBoss hibernate站点的一个示例:

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似乎很喜欢猫。

我遇到了同样的问题,并且标准api orderBy方法无法处理连接的列。我需要这个与criteribuilder .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));

当然你也必须选择这个连接的列。

最新更新