如何用hibernate标准调用postgres函数

时间:2013-05-09 10:53:26

标签: java hibernate postgresql postgresql-9.2

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

2 个答案:

答案 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发表您的建议。