Java 如何使用hibernate条件调用postgres函数
我使用hibernate标准获得排序结果,该标准生成以下sql:Java 如何使用hibernate条件调用postgres函数,java,hibernate,postgresql,postgresql-9.2,Java,Hibernate,Postgresql,Postgresql 9.2,我使用hibernate标准获得排序结果,该标准生成以下sql: select * from mytable order by name asc; 以下是我如何使用Hibernate标准: criteria.addOrder(Order.asc("name")); 现在,我在postgres DB中创建了一个函数:customSort(text) 并希望与hibernate条件一起使用,以便生成以下sql: select * from mytable order by customSort(
select * from mytable order by name asc;
以下是我如何使用Hibernate标准:
criteria.addOrder(Order.asc("name"));
现在,我在postgres DB中创建了一个函数:customSort(text)
并希望与hibernate条件一起使用,以便生成以下sql:
select * from mytable order by customSort(name) asc;
如何在hibernate中调用此函数以进行自定义排序并生成等效的sql
任何代码示例都会有很大帮助
谢谢,
Akhi使用Hibernate来实现这一点
不能在标准查询中访问特定于数据库的本机函数
sess.createSQLQuery("select * from mytable order by
customSort(name) asc").list();
我在这方面花了一些时间,通过从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(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;
请发表你的建议 谢谢baadshah,但我只想避免硬编码的sql。有什么不同的方法吗?好的,没有。对不起,我不知道是否还有其他方法。非常确定您可以映射该过程,然后从标准中调用它,但我很幸运地不再需要使用JPA了。似乎您需要花费大量精力,创建不必要的难以理解的代码来运行存储过程。我为那个在几年内必须维护你的代码的家伙感到抱歉。
select customSort(col1), col2, col3 from mytable order by customSort(name) asc;