Функция подобия Postgres с данными spring

#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;