Определить параметры сортировки для каждого запроса - PullRequest
0 голосов
/ 23 мая 2018

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

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

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

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

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

query = query + ' collate SQL_Latin1_General_CP1_CI_AS'

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете попробовать использовать собственный адаптер БД с собственным переводчиком 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 (узел данных -> адаптер).

...