Независимое от базы данных сравнение строк с JPA
Я работаю с 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
должен получить uniqueConstraint, и это одна из моих целей, но это возможно только в том случае, если база данных выполнит сравнение строк с учетом регистра.
Есть ли решение, в котором я могу настроить JPA для сравнения строк с учетом регистра без необходимости точной настройки базы данных вручную?