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
如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]
如何在 Visual Studio 2019 的 Datagrid 视图中连接 MySQL DataTable 中的两列?