Определение сопоставления для каждого запроса

Мы используем Apache Cayenne для интеграции уже существующей базы данных MS SQL Server с нашим приложением (у меня нет разрешения на изменение DDL базы данных, включая сопоставление таблицы/схемы/базы данных).

База данных использует определенную сортировку (хорватскую), которая определяет отдельные символы, такие как «nj» и «dž», поэтому, когда я выполняю запрос LIKE:

select * from table where name like '%N%'
Я получаю нулевые результаты, с другой стороны, если я делаю:
select * from table where name like '%NJ%'
я получаю несколько результатов.

Очевидно, это легко исправить, добавив collate в конец запроса, но я не знаю, как это сделать с Cayenne. Есть ли способ реализовать это, не отказываясь от преимуществ ORM в целом?

tl;dr: есть ли способ предварительной обработки запросов перед обращением к базе данных, например:

query = query + ' collate SQL_Latin1_General_CP1_CI_AS'


person adnan_e    schedule 23.05.2018    source источник


Ответы (1)


Вы можете попробовать использовать пользовательский адаптер БД с настраиваемым транслятором SQL, который добавит необходимую часть ко всем выбранным запросам. Для Cayenne 4.0 можно реализовать следующим образом:

public class CustomSQLServerAdapter extends SQLServerAdapter {

    public CustomSQLServerAdapter(/* all params */) {
        super(/* all params */);
    }

    @Override
    public SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver) {
        return new SQLServerSelectTranslator(query, this, entityResolver) {
            @Override
            protected void doTranslate() {
                super.doTranslate();
                sql += " collate SQL_Latin1_General_CP1_CI_AS";
            }
        };
    }
}

Чтобы использовать этот адаптер, вы можете предоставить для него собственный детектор (см. документы) или установить его непосредственно в Modeler (узел данных -> адаптер).

person Nikita    schedule 24.05.2018