В моем приложении трафика есть таблица базы данных с информацией о трамвайных остановках. Каждой трамвайной остановке может быть назначено до 11 строк (каждая в отдельном столбце), которая описывает направление, с которого трамваи уходят с платформы.
Приведенный ниже запрос иллюстрирует ситуацию, когда пользователь вводит название трамвайной остановки и направление, так что выбирается конкретная платформа. Запрос касается пользователей, которые вводят строчные / только латинские символы, так что ĄŚĆ
также можно найти для ввода asc
.
SELECT id
FROM stations_directions
WHERE
((offline IS NULL) OR (offline <> 1))
AND
(name = ?1)
AND
(
translate(lower(main_dir), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir1), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir2), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir3), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir4), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir5), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir6), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir7), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir8), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir9), 'ąćęłńóśźż', 'acelnoszz') = ?2
OR
translate(lower(add_dir10), 'ąćęłńóśźż', 'acelnoszz') = ?2
)
Как видите, запрос длинный и повторяющийся. Я ищу способы, как оптимизировать его путем изменения запроса или базы данных.
Другой вопрос, как использовать такой запрос в Spring Boot JPA? В JPQL нет возможности использовать методы как lower()
. Я пытался с EntityManager
и createNativeQuery()
, но это не сработало:
EntityManager em;
public String findId(String name, String direction, String sql) {
Query q = em.createNativeQuery(sql);
q.setParameter(1,name);
q.setParameter(2,direction);
return q.getSingleResult().toString();
}