休眠标准:如何按两列串联排序?

2022-09-02 12:58:49

我有一个“人员”表,其中包含两列:first_name和last_name。Person 类有两个对应的字段:名字和姓氏。现在,我正在使用标准 api 并尝试基于这两列串联创建订单。可能吗?还是只能通过 hql 来实现?


答案 1

下面是 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的猫。


答案 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));

当然,您还必须选择此串联列。


推荐