Проблема с кодировкой базы данных UTF-8 при попытке получить данные из приложения весенней загрузки

Моя база данных Oracle не поддерживает кодировку utf-8, однако значения столбцов некоторых таблиц по-прежнему состоят из символов utf-8. он вставляется с использованием текстового литерала N. Итак, моя цель — иметь возможность фильтровать эти символы utf-8 из приложения весенней загрузки. В настоящее время, когда я пытаюсь фильтровать данные, символы utf-8 читаются как '?' знаки вопроса в базе данных. Моя первоначальная мысль, которую нужно исправить, заключалась в том, чтобы добиться следующего запроса оракула в моем загрузочном приложении Spring. SELECT * FROM entity WHERE text like N'%utf-8-characters%' (этот запрос корректно работает в базе данных)

Мне не удалось найти код hql для замены строкового литерала N.

  @Query("SELECT e FROM Entity e WHERE " + "(:filter is null or :filter = '' or "
      + "LOWER(e.text) LIKE CONCAT('%',LOWER(:filter), '%')  "
      + "ORDER BY e.modifiedDate DESC")
  Page<Entity> findAllByOrderByModifiedDateDesc(@Nullable String filter, Pageable pageable);

Я также попробовал собственный запрос, он работал, например, если я жестко запрограммировал фильтр, но не мог соединиться с входящим аргументом. работает, но жестко запрограммировано -> WHERE text LIKE N'%აა%' недействительно -> WHERE text LIKE N:filter

@Query(value = "SELECT * FROM entity WHERE text LIKE CONCAT('%',CONCAT(:filter,'%')) ORDER BY modified_date",nativeQuery = true)
Page<Entity> findAllByOrderByModifiedDateDesc(@Nullable String filter, Pageable pageable);

добавление свойств кодировки не будет работать, потому что, как я уже сказал, сама база данных не читает символы utf-8.

spring.datasource.url=jdbc:oracle:thin:@111.11.1.111:1111:DB?useUnicode=true&characterEncoding=UTF-8
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

ни такие bean-компоненты, как CharacterEncodingFilter.

🤔 А знаете ли вы, что...
СУБД Oracle поддерживает многозадачность, что позволяет обрабатывать множество запросов одновременно.


51
1

Ответ:

Решено

Сначала вам нужно добавить свойство в признанные национализированные поля в базе данных:

spring.jpa.properties.hibernate.use_nationalized_character_data=true

тогда все, что мне нужно было сделать, это не использовать функции оракула. Я не знаю почему, но

       @Query("SELECT e FROM Entity e WHERE e.text LIKE %:messagePrefix% ")

этот запрос работает правильно с символами utf-8. однако при использовании функций оракула, таких как Concat, это не сработало @Query("SELECT e FROM Entity e WHERE e.text LIKE CONCAT('%',:text,'%') ") Даже для @Query("SELECT e FROM Entity e WHERE Lower(e.text) LIKE %:text% ") это не работает