我使用hibernate条件获取排序结果,生成以下sql:
select * from mytable order by name asc;
这就是我用hiberante标准做的事情:
criteria.addOrder(Order.asc("name"));
现在,我在postgres DB中创建了一个函数:customSort(text)
并希望使用hibernate标准,以便生成以下sql:
select * from mytable order by customSort(name) asc;
如何在hibernate中调用此函数来进行自定义排序并生成等效的sql?
任何代码示例都会有很多帮助
谢谢, Akhi
答案 0 :(得分:1)
使用Hibernate Native SqlQuery来实现此目的。
您无法在条件查询中访问特定于数据库的本机函数。
sess.createSQLQuery("select * from mytable order by
customSort(name) asc").list();
答案 1 :(得分:0)
我花了一些时间在这上面,通过从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”))
这个工作,我能够将DB方法调用放在where子句中作为
select * from mytable order by customSort(name) asc;
我只是想知道是否有类似的方式,我可以使用标准在选择部分中放置此函数调用? 例如:
select customSort(col1), col2, col3 from mytable order by customSort(name) asc;
pelase发表您的建议。