Я работаю с JPA (Hibernate в качестве провайдера) и базовой базой данных MySQL.
У меня есть таблица с каждым названием улиц в Германии. Каждое название улицы имеет уникальный номер. Для одного задания мне нужно узнать номер имени. Для этого я написал JPQL-запрос, подобный следующему
"SELECT s FROM Strassencode s WHERE s.name = :name"
К сожалению, в Германии есть названия улиц, которые отличаются только маленькими и заглавными буквами, такими как «Am kleinen Feld» и «Am Kleinen Feld». Очевидно, что одно из них является грамматически неправильным, но как название улицы, оба написания разрешены, и оба имеют разное число.
Когда я отправляю свой JPQL-запрос в базу данных, я использую
query.getSingleResult();
из-за того, что каждое название улицы в таблице уникально. Но с базой данных MySQL я получу NonUniqueResultException
, потому что база данных mySQL по умолчанию выполняет сравнение без учета регистра. Распространенный способ заставить MySQL написать запрос типа
SELECT 'abc' LIKE BINARY 'ABC';
, как описано в главе 11.5.1 Справочного руководства mySQL, но в JPQL нет соответствующего ключевого слова.
Моей первой попыткой было аннотировать поле name
в классе с помощью
@Column(nullable = false, columnDefinition = "varbinary(128)")
В аннотации, подобной этой, база данных автоматически выполняет сравнение с учетом регистра, поскольку одна из строк является двоичной. Но когда я использую это решение, у меня возникают проблемы, когда я читаю имена из базы данных, чтобы записать их в файл, потому что такие буквы, как ä, ö, ü, интерпретируются неправильно.
Я знаю, что поле name
должно получить уникальное ограничение, и это одна из моих целей, но это возможно только в том случае, если база данных выполнит сравнение строк с учетом регистра.
Есть ли решение, в котором я могу настроить JPA для сравнения строк с учетом регистра без необходимости точной настройки базы данных вручную?