3

我正在使用生成以下 sql 的休眠条件获得排序结果:

select * from mytable order by name asc;

这就是我使用hiberante标准的方式:

criteria.addOrder(Order.asc("name"));

现在,我在 postgres DB 中创建了一个函数:customSort(text)

并希望与休眠条件一起使用,以便生成以下 sql:

select * from mytable order by customSort(name) asc;

如何在休眠中调用此函数以进行自定义排序并生成等效的 sql?

任何代码示例都会有很大帮助

谢谢,阿基

4

2 回答 2

1

使用 Hibernate Native SqlQuery来实现这一点。

您不能在标准查询中访问特定于数据库的本机函数。

sess.createSQLQuery("select * from mytable order by
                                        customSort(name) asc").list();
于 2013-05-09T10:56:41.300 回答
1

我已经花了一些时间,并通过从 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;

请发表您的建议。

于 2013-06-27T02:25:30.070 回答