gpt4 book ai didi

Hibernate Criteria Query - 同时按两列排序

转载 作者:行者123 更新时间:2023-12-04 02:22:06 25 4
gpt4 key购买 nike

我最近发现我试图按两个同等重要的列来排序 Hibernate Criteria Query。基本上我的意思是,如果我有一个表,其中一列是日期 (createdOnDate),另一列是日期 (modifiedOnDate),我想比较 Organization 对象的 orderBy 子句中的所有日期。

为此我试过这样的:

session.createCriteria(Organization.class).addOrder(Order.desc("modified_date")).addOrder( Order.desc("created_date") ).list();

但它首先根据 modified_date 对所有组织进行排序,然后再次使用 created_date 进行排序。这意味着修改后的记录可能出现在任何 createdOn 记录之前,即使 createdOnDate 更早。

我需要排序与 created_date 和 modified_date 同时发生。

请为此提供帮助。

提前致谢。

最佳答案

您可以在 sql 中使用“COALESCE()”函数从两列中获取值,当第一列为 null 而第二列为空时,

ORDER BY COALESCE( alias_1.modified_date, alias_1.created_date ) ASC;

所以这意味着如果“modified_date”列中存在的值不存在则进行排序,而不是从“created_date”中进行排序。

在 COALESCE() 函数的 hibernate 标准中,我认为没有 Order Bean,因此您可以扩展和编写自己的实现。

就这样吧,有错请指正。

public class CoalesceOrder extends Order {
private String[] properties;

protected CoalesceOrder(boolean ascending, String... properties) {
super(properties.toString(), ascending);
this.properties = properties;
}

@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {

StringBuilder fragment = new StringBuilder();
StringBuilder exp = new StringBuilder();
fragment.append("COALESCE(");
SessionFactoryImplementor factory = criteriaQuery.getFactory();
for (int j = 0; j < this.properties.length; j++) {
String propertyName = this.properties[j];
String[] columns = criteriaQuery.getColumnsUsingProjection(
criteria, propertyName);
Type type = criteriaQuery.getTypeUsingProjection(criteria,
propertyName);
StringBuilder fragForField = new StringBuilder();
for (int i = 0; i < columns.length; i++) {
final StringBuilder expression = new StringBuilder();
boolean lower = false;
if (super.isIgnoreCase()) {
int sqlType = type.sqlTypes(factory)[i];
lower = sqlType == Types.VARCHAR || sqlType == Types.CHAR
|| sqlType == Types.LONGVARCHAR;
}

if (lower) {
expression.append(
factory.getDialect().getLowercaseFunction())
.append('(');
}
expression.append(columns[i]);
if (lower)
expression.append(')');
fragForField.append(expression.toString());
if (i < columns.length - 1)
fragForField.append(", ");
}
exp.append(fragForField.toString());
if (j < properties.length - 1)
exp.append(", ");
}
exp.append(")");

fragment.append(factory.getDialect().renderOrderByElement(
exp.toString(), null, super.isAscending() ? "asc" : "desc",
factory.getSettings().getDefaultNullPrecedence()));
return fragment.toString();
}

public static Order asc(String... properties) {
return new CoalesceOrder(true, properties);
}

public static Order desc(String... properties) {
return new CoalesceOrder(false, properties);
}
}

您可以像这样添加订单

criteria.addOrder(CoalesceOrder.desc("modified_date", "created_date"));

关于Hibernate Criteria Query - 同时按两列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com