Postgres与弹簧数据的相似性函数



我试图在我的spring-boot服务中实现一个搜索查询,该服务使用postgres的similarity(text, text)函数。我在postgres控制台中获得了相似性,并设法将其作为本机查询转移到@Repository接口。它似乎正确地构造了查询,但每次我尝试执行查询时,我都会得到

ERROR: function similarity(text, character varying) does not exist

当我再次尝试创建扩展时,我得到一个异常,即此扩展已经安装。

我错过了什么?我需要一些Spring/JPA魔术对象来启用它吗?

示例实体:


import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "example")
@Data
public class ExampleEntity {
@Id
private String id;
private String textField;
}

示例存储库:

import java.util.Set;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ExampleRepository extends CrudRepository<ExampleEntity, String> {
@Query(nativeQuery = true,
value = "SELECT * FROM example ORDER BY similarity(:searchString)")
List<ExampleEntity> findBySimilarity();

@Query(nativeQuery = true, value = "CREATE EXTENSION pg_trgm")
void createSimilarityExtension();
}

测试代码(不包括设置,因为它相当复杂(:

public void test() {
ExampleEntity r1 = dbUtils.persistNewRandomEntity();
ExampleEntity r2 = dbUtils.persistNewRandomEntity();
ExampleEntity r3 = dbUtils.persistNewRandomEntity();
try {
exampleRepository.createSimilarityExtension();
} catch (InvalidDataAccessResourceUsageException e) {
// always says that the extension is already setup
}
List<ExampleEntity> bySimilarity = exampleRepository.findBySimilarity(r2.getTextField());
for (ExampleEntity entity : bySimilarity) {
System.out.println(entity);
}
}

事实证明,我在尝试扩展是否有效时,在错误的模式中创建了扩展。然后,我将扩展添加到DB迁移脚本中,但如果扩展存在,则会跳过它。因此,我的扩展是为公共模式注册的,在我的服务使用的实际模式中不起作用。

因此,如果您遇到与我相同的问题,请确保您的扩展是为正确的模式创建的,方法是使用:

SET SCHEMA <your_schema>; CREATE EXTENSION pg_trgm;

最新更新