Hibernate条件查询-同时按两列排序

Hibernate条件查询-同时按两列排序,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我最近遇到的一个问题是,我试图按两个同等重要的列对Hibernate条件查询进行排序。基本上我的意思是,如果我有一个表,其中一列是日期(createdOnDate),另一列是日期(modifiedOnDate),我想比较orderBy子句中Organization对象的所有日期 为此,我试着这样做: session.createCriteria(Organization.class).addOrder(Order.desc("modified_date")).addOrder( Order.de

我最近遇到的一个问题是,我试图按两个同等重要的列对Hibernate条件查询进行排序。基本上我的意思是,如果我有一个表,其中一列是日期(createdOnDate),另一列是日期(modifiedOnDate),我想比较orderBy子句中Organization对象的所有日期

为此,我试着这样做:

session.createCriteria(Organization.class).addOrder(Order.desc("modified_date")).addOrder( Order.desc("created_date") ).list();
但它首先根据修改后的日期对所有组织进行排序,然后再次使用创建的日期进行排序。这意味着即使createdOn日期更早,修改后的记录也可能出现在任何createdOn记录之前

我需要排序与创建日期和修改日期同时进行

请帮忙

提前感谢。

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

ORDER BY COALESCE( alias_1.modified_date, alias_1.created_date ) ASC;
所以,这意味着如果“修改日期”列中的值不存在,则进行排序,而不是从“创建日期”中进行排序

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

就这样,如果错了请纠正我

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);
}
}

试着先解释一下应该是什么类型。举个例子。在两列上同时排序对我来说没有任何意义。@java developer类似的问题和良好的解决方案只适用于“null”值,TS指定它们不是都为null。你知道如何使用jpa 2吗?
criteria.addOrder(CoalesceOrder.desc("modified_date", "created_date"));