Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate сортировка с учетом локали


Автор: OutLaw 9.1.2008, 11:37
у меня есть таблица с кодировкой UTF-8
в ней есть колонка, делаю выборку с упорядочиванием 
сортировка проходит неверно
пример:
1. Sä
2. Se

но в алфавите 'ä' идет после 'e' т.к. она в конце алфавита

как мне сделать сортировку с учетом локали или есть какой-то другой способ?

Автор: Zlatogorov 9.1.2008, 11:55
Тут нужен или свой сортировщик или Codepage менять на сервере.

Автор: OutLaw 9.1.2008, 12:00
т.е. я не могу просто сделать так чтобы как-то указать в Criteria или еще где-то нужный Locale?

Автор: Zlatogorov 9.1.2008, 13:26
Похоже что нет.
Для наборов (set) можно прописать sort="xxx.yyy.MzHibernateComparator"  и там сортировать.
Оказывается можно при создании сессии это сделать:
Код

public class HibernateSession {
private static Logger logger = Logger.getLogger(HibernateSession.class.getName());
    public static Properties props = null;
    private static SessionFactory sessionFactory = null;
    private static final ThreadLocal threadSession = new ThreadLocal();
    private static final ThreadLocal threadTransaction = new ThreadLocal();
    static {
//#### set locale here
     Locale.setDefault(Locale.ENGLISH);
        Configuration c = new Configuration().configure();
        props = c.getProperties();
        sessionFactory = c.buildSessionFactory();
    }
    public static Properties getProperties() {
        return props;
    }
    public static Session openSession() { 
        Session s = (Session) threadSession.get();
        if (s == null) {
            s = sessionFactory.openSession();
            threadSession.set(s);
        }
        return s;
    }
    public static void closeSession() { 
        Session s = (Session) threadSession.get();
        threadSession.set(null);
        if (s != null && s.isOpen())
            s.close();
    }
    public static void beginTransaction() { 
        Transaction tx = (Transaction) threadTransaction.get();
        if (tx == null) {
            tx = openSession().beginTransaction();
            threadTransaction.set(tx);
        }
    } 
    public static void commitTransaction() { 
        Transaction tx = (Transaction) threadTransaction.get();
        if ( tx != null && !tx.wasCommitted()
             && !tx.wasRolledBack() )
            tx.commit();
        threadTransaction.set(null);
    }
    public static void rollbackTransaction() { 
        Transaction tx = (Transaction) threadTransaction.get();
        try {
            threadTransaction.set(null);
            if ( tx != null && !tx.wasCommitted()
                 && !tx.wasRolledBack() ) { 

tx.rollback();
            }
        } finally {
            closeSession();
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    } 
}

 
В данном случае прописываем Locale.setDefault(Locale.GERMANY);

Автор: OutLaw 9.1.2008, 13:51
и что ты хочешь сказать, что вот это Locale.setDefault(Locale.ENGLISH);
изменит конфигурацию connection ?

Автор: Zlatogorov 9.1.2008, 13:56
Можете и не делать smile
Дело лично ваше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)