我使用的是Spring + Tomcat8和PostgreSQL 9.2。我在数据库上安装了Trigram扩展,以改进在表中的搜索。
当我手动连接到我的数据库时,下面的语句工作:
SELECT id, name, similarity(name, 'a') FROM dev.customer WHERE name % 'a' ORDER BY similarity ;
然而,当我在使用jdbcTemplate.query()
的Spring中尝试时,我得到一个错误:
PSQLException: ERROR: function similarity(character varying, character varying) does not exist
当我删除similarity()
函数并仅使用%
操作符时,我得到以下异常:
ERROR: operator does not exist: character varying % character varying
似乎postgres jdbc驱动程序需要配置以支持非标准语法:https://jdbc.postgresql.org/documentation/81/ext.html
tomcat安装的server.xml
包含以下资源:
<Resource name="jdbc/NasPostgresDB" auth="Container" type="javax.sql.DataSource"
username="usr" password="pwd"
url="jdbc:postgresql://127.0.0.1/dbname"
driverClassName="org.postgresql.Driver"
initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5"
validationQuery="select 1"
poolPreparedStatements="true"/>
应该正确:https://jdbc.postgresql.org/documentation/81/load.html
我到底需要做些什么来使三字母匹配工作?
在PostgreSQL中,每个对象(无论是表,索引还是函数)都属于模式。正如你在评论中所说,你安装了扩展:
SET SCHEMA 'dev'; CREATE EXTENSION pg_trgm;
我假设在dev schema中可以访问这些函数。
如果是这种情况,您应该能够以这种方式在JDBC中使用它们:
SELECT id, name, dev.similarity(name, 'a') as similarity FROM dev.customer
WHERE name % 'a' ORDER BY similarity ;