首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化10列搜索及其在Spring Boot中的应用

优化10列搜索及其在Spring Boot中的应用
EN

Stack Overflow用户
提问于 2018-09-05 15:50:44
回答 1查看 34关注 0票数 0

在我的交通应用程序中,有一个数据库表,其中包含有关电车站的信息。对于每个电车站,最多可以分配11个字符串(每个字符串在单独的列中),这些字符串描述电车从月台出发的方向。

下面的查询说明了用户键入电车站的名称和方向,以便选择特定站台的情况。该查询处理用户输入小写/只输入拉丁字符,以便也可以为asc输入找到ĄŚĆ

代码语言:javascript
复制
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()。我尝试使用EntityManagercreateNativeQuery(),但没有成功:

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-05 16:40:55

您应该改用:

代码语言:javascript
复制
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)
);

和一个查询:

代码语言:javascript
复制
select station_id from stations
join station_directions using station_id
where
  name=?
  and not offline
  and lower(unaccent(direction))=?;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52179867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档