Hibernate 标准:如何通过连接的两列排序?

Posted

技术标签:

【中文标题】Hibernate 标准:如何通过连接的两列排序?【英文标题】:Hibernate criteria: how to order by two columns concatenated? 【发布时间】:2011-10-08 20:41:43 【问题描述】:

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

【问题讨论】:

仅当您连接它们的小写(或大写)表示时,按连接列排序才有意义。否则,排序等同于按 2 列排序,即按 first_name、last_name 排序。 @Andrey 两种方法的结果不一样吗?如果您首先按名字/姓氏排序,则必须小心。 @toto,在大多数情况下它会,但假设您有这些名字要排序:(John Anderson,Johna Butcher)。 JohnAndreson johnabutcher,因为 A @Andrey 如果你用名字和姓氏之间的空格连接它们,你就不会遇到这个问题。如果先对姓氏进行排序,然后根据名字对排序后的数据进行排序,也可以避免此问题。 【参考方案1】:

这里是JBoss hibernate site 的示例:

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 的猫。

【讨论】:

在这种情况下,订单列未连接。我想实现类似“按名字排序 || ' ' || 姓氏” 正如我在 cmets 中对您上面的问题所写的那样,我看不出有什么区别。 哦,是的,没错。抱歉,我没有先阅读您上面的 cmets。但是当我需要按 field1 + field2 排序的情况下呢? field1 和 field2 都是数字。 你可以试试order by (item.field1 + item.field2)。我不知道它是否会起作用,所以请告诉我。我找到了一个他们使用除法的 SQL 示例,所以我的猜测是 hql 也可以处理排序操作。如果数学运算确实有效,order by concat(item.lastName + " " + item.firstName) 也可能有效。 hql 对这种操作很好,但标准 api 似乎失败了。【参考方案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));

当然你还必须选择这个串联的列。

【讨论】:

以上是关于Hibernate 标准:如何通过连接的两列排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在JPA / JAVA / Hibernate的两列中插入自动生成的ID

如何在 Pandas 中连接包含列表(系列)的两列

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]

如何在 Visual Studio 2019 的 Datagrid 视图中连接 MySQL DataTable 中的两列?

有没有办法区分同名的两列(非连接)

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来