我具有存储的各种语言的特定字符串一个Oracle XMLType列。我需要构建此列上一个Hibernate标准的订单。为了做到这一点,我需要与Oracle函数来提取值。该标准是由我写的代码自动生成的,但我不能为我的生活,弄清楚如何通过标准API提取它的价值和秩序。基本上,所生成的SQL应该看起来像:

SELECT EXTRACTVALUE(title, '//value[@lang="EN"]') AS enTitle
FROM domain_object 
ORDER BY enTitle

我有突起拨弄暂时的,但它们似乎执行第二选择。我以为会导致休眠选择ALL值,并在内存中的排序它们基于投影?这将是非常不希望= \

有帮助吗?

解决方案

好,我发现的溶液。不知道这是的的,所以我会离开它打开了一小会儿,如果有人想提供一个更好的答案/缩小我的解决方案。

我所做的是正是如此延伸org.hibernate.criterion.Order

package com.mycorp.common.hibernate;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Order;
import org.hibernate.engine.SessionFactoryImplementor;

import com.mycorp.LocalizationUtil;

public class LocalStringOrder extends Order {
    private static final long serialVersionUID = 1L;

    private boolean ascending;
    private String  propName;

    public LocalStringOrder(String prop, boolean asc) {
        super(prop, asc);
        ascending    = asc;
        propName = prop;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propName);
        StringBuffer fragment = new StringBuffer();
        for ( int i=0; i<columns.length; i++ ) {
            SessionFactoryImplementor factory = criteriaQuery.getFactory();
            fragment.append( factory.getDialect().getLowercaseFunction() )
            .append('(');
            fragment.append("EXTRACTVALUE(");
            fragment.append( columns[i] );
            fragment.append(", '//value[@lang=\"" + 
                LocalizationUtil.getPreferedLanguage().name() + 
                "\"')");
            fragment.append(')');
            fragment.append( ascending ? " asc" : " desc" );
            if ( i<columns.length-1 ) fragment.append(", ");
        }
        return fragment.toString();
    }

    public static Order asc(String propertyName) {
        return new LocalStringOrder(propertyName, true);
    }


    public static Order desc(String propertyName) {
        return new LocalStringOrder(propertyName, false);
    }
}

然后,它只是一种说法criteria.addOrder(LocalStringOrder.asc('prop'))的物质。

其他提示

另一个一般的解决方案是NativeSQLOrder,请参阅 HTTP://opensource.atlassian。 COM /项目/休眠/浏览/ HHH-2381 。我不已了解,为什么这个功能不处于休眠呢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top