Оптимизация поиска в 10 столбцах и применение его в Spring Boot - PullRequest
0 голосов
/ 05 сентября 2018

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

1 Ответ

0 голосов
/ 05 сентября 2018

Вы должны использовать вместо:

create extension unaccent;
create table stations (
  station_id serial primary key,
  name text not null,
  offline boolean not null
);
create table station_directions (
  station_id int not null references stations(station_id),
  direction text not null,
  primary_key(station_id, direction)
);

И запрос:

select station_id from stations
join station_directions using station_id
where
  name=?
  and not offline
  and lower(unaccent(direction))=?;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...