Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用hibernate条件调用postgres函数_Java_Hibernate_Postgresql_Postgresql 9.2 - Fatal编程技术网

Java 如何使用hibernate条件调用postgres函数

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(

我使用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(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;