#postgresql #spring-data-jpa
Вопрос:
Я попытался реализовать поисковый запрос в своем сервисе spring-boot, который использует similarity(text, text)
функцию postgres. Я получил сходство, работающее в консоли 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);
}
}
Ответ №1:
Оказывается, я создал расширение в неправильной схеме, пытаясь выяснить, будет ли расширение вообще работать. Затем я добавил расширение в свой сценарий миграции БД, но пропустил бы его, если бы расширение существовало. Поэтому мое расширение было зарегистрировано для общедоступной схемы и не работало в реальной схеме, которую использует моя служба.
Поэтому, если у вас та же проблема, что и у меня, убедитесь, что ваше расширение создано для правильной схемы с помощью:
SET SCHEMA <your_schema>; CREATE EXTENSION pg_trgm;