سؤال

لدي عمود Oracle XMLTYPE الذي يخزن سلاسل اللغة المختلفة المحددة. أحتاج إلى بناء معايير السبات أوامر على هذا العمود. من أجل القيام بذلك، أحتاج إلى استخراج القيمة مع وظيفة أوراكل. يتم إنشاء هذه المعايير تلقائيا بواسطة الرمز الذي كتبته ولكني لا أستطيع، من أجل الحياة، معرفة كيفية استخراج القيمة والنظام عليه عبر المعايير API. أساسا، يجب أن تبدو SQL التي تم إنشاؤها شيء مثل:

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

أنا fiddled مع التوقعات لحظات، ولكن يبدو أنها تنفذ اختيار ثانية. الذي أفترض أنه سيضر السبات لتحديد جميع القيم وفي الذاكرة فرزها بناء على الإسقاط؟ سيكون هذا غير مرغوب للغاية =

هل كانت مفيدة؟

المحلول

حسنا، وجدت أ المحلول. لست متأكدا من هذا هو أفضل, ، لذلك سأترك الأمر مفتوحا لفترة قصيرة إذا كان بعض المرء يريد تقديم إجابة أفضل / تحسين حلاي.

ما فعلته هو تمديد 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')).

نصائح أخرى

حل عام آخر هو NativeQLorder، وانظر http://opensource.atlassian.com/projects/hopernate/browse/hhh-2381.. وبعد أنا لا undestand، لماذا هذه الميزة ليست في السبات حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top