jav*_*per 4 hibernate hibernate-criteria
我最近遇到尝试通过两列同等重要的列来排序 Hibernate Criteria 查询。基本上我的意思是,如果我有一个表,其中一列是日期(createdOnDate),另一列是日期(modifiedOnDate),我\xe2\x80\x99d喜欢比较Organization对象的orderBy子句中的所有日期。
\n\n为此我尝试这样:
\n\nsession.createCriteria(Organization.class).addOrder(Order.desc("modified_date")).addOrder( Order.desc("created_date") ).list();\nRun Code Online (Sandbox Code Playgroud)\n\n但它首先根据modified_date 对所有组织进行排序,然后再次使用created_date 进行排序。这意味着修改的记录可能出现在任何createdOn记录之前,即使createdOnDate更早。
\n\n我需要与创建日期和修改日期同时进行排序。
\n\n请为此提供帮助。
\n\n提前致谢。
\n当第一个列为空而不是第二列时,您可以使用 sql 中的“COALESCE()”函数从两列中获取值,
ORDER BY COALESCE( alias_1.modified_date, alias_1.created_date ) ASC;
Run Code Online (Sandbox Code Playgroud)
因此,这意味着如果“modified_date”列中存在值,则进行排序(如果不存在)则从“created_date”中获取进行排序。
在 COALESCE() 函数的休眠标准中,我认为没有 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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以立即添加订单,例如
criteria.addOrder(CoalesceOrder.desc("modified_date", "created_date"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6249 次 |
| 最近记录: |