문제

다양한 언어 별 문자열을 저장하는 Oracle XMLType 열이 있습니다. 이 열에서 주문하는 최대 절전 모드 기준을 구성해야합니다. 이를 위해서는 Oracle 기능으로 값을 추출해야합니다. 이 기준은 내가 작성한 코드에 의해 자동으로 생성되지만, 내 삶에 대해 기준 API를 통해 값과 주문을 추출하는 방법을 알아낼 수는 없습니다. 기본적으로 생성 된 SQL은 다음과 같습니다.

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

나는 돌출부를 순간적으로 충전했지만 두 번째 선택을 실행하는 것으로 보인다. 최대 절전 모드가 모든 값을 선택하고 메모리에서 투영에 따라 분류 할 것이라고 생각하는 것은 무엇입니까? 이것은 매우 바람직하지 않을 것입니다 =

도움이 되었습니까?

해결책

좋아, 나는 찾았다 해결책. 이것이 확실하지 않습니다 베스트, 그래서 어떤 사람이 더 나은 답변을 제공하고 내 솔루션을 개선하기를 원한다면 잠시 동안 열어 두겠습니다.

내가 한 일은 확장되었습니다 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/projects/hibernate/browse/hhh-2381. 나는 의지가 없다. 왜이 기능이 아직 최대 절전 모드에 있지 않은지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top