Spring JPA - определение функции SQL для использования в пользовательских запросах - PullRequest
0 голосов
/ 30 октября 2019

Давайте предположим, что у нас есть репозиторий на основе Spring JPA

@Repository
public interface MyClassRepository extends CrudRepository<MyClass, Long> {

}

с сущностью

@Entity
@Table(name = "classes")
public class MyClass {

    private double latitude;
    private double longitude;

    // Getter + Setter
}

Я попытался найти все сохраненные записи в данном экземпляре вокруг ссылочного объекта. Для расчета расстояния между позицией первого объекта и позицией второго объекта я подумал о пользовательском @Query в сочетании с формулой Гаверсайна .

@Query("SELECT c FROM MyClass c WHERE :distance >= haversine(c, :origin)")
public List<Passenger> findAll(@Param("origin") MyClass origin, @Param("distance") double distance);

Можно ли определить функцию SQLhaversine() в дополнительном запросе, например, @Query("CREATE FUNCTION haversine(...) ..."), потому что я использую эту функцию в нескольких пользовательских запросах и пытаюсь предотвратить повторение кода. Есть идеи по этому поводу?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Вы можете добавить свою функцию Sql, например, через миграцию БД, как обычно, и расширить org.hibernate.dialect (см., Например, как это сделано для Postgis), и не забудьте указать диалект для вашего источника данных

 public class YourDialect extends PostgreSQL95Dialect {
          public YourDialect() {
            super();
            registerFunction("haversine", new StandardSQLFunction("haversine", StandardBasicTypes.DOUBLE));
      }
}
0 голосов
/ 30 октября 2019

Вы должны создать функцию в вашей БД. Функции являются «статическими» элементами - они должны присутствовать в БД во время выполнения запроса.

Кроме того, в вашем методе есть некоторые ошибки. В запросе вы выбираете из таблицы «MyClass», но ваш метод возвращает «List».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...