我已经花了一些时间,并通过从 Order.java 扩展类 CustomOrder.java 并覆盖 toString() 方法找到了一个解决方案,如下所示:
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException
{
String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
StringBuffer fragment = new StringBuffer();
for (int i = 0; i < columns.length; i++)
{
SessionFactoryImplementor factory = criteriaQuery.getFactory();
fragment.append("customOrder");
fragment.append("(");
boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR;
if (lower)
{
fragment.append(factory.getDialect().getLowercaseFunction())
.append('(');
}
fragment.append(columns[i]);
if (lower)
fragment.append(')');
fragment.append(")");
fragment.append(ascending ? " asc" : " desc");
if (i < columns.length - 1)
fragment.append(", ");
}
return fragment.toString();
}
那么我们需要调用:
criteria.addOrder(CustomOrder.asc("name"));
而不是调用 criteria.addOrder(Order.asc("name"))
这行得通,我能够将数据库方法调用放在 where 子句中
select * from mytable order by customSort(name) asc;
我只是想知道是否有类似的方法可以使我也可以使用标准将此函数调用放在选择部分中?例如:
select customSort(col1), col2, col3 from mytable order by customSort(name) asc;
请发表您的建议。