Spring JPA-定义要在自定义查询中使用的SQL函数

问题描述 投票:0回答:2

假设我们有一个基于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
}

我试图在给定实例周围的引用对象中查找所有存储的记录。为了计算第一个对象的位置与第二个对象的位置之间的距离,我考虑了一个自定义的@QueryHaversine Formula的组合。

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

是否可以在其他查​​询中定义SQL函数haversine(),例如@Query("CREATE FUNCTION haversine(...) ..."),因为我必须在多个自定义查询中使用此功能,并且我尝试防止代码重复。有任何想法吗?

sql spring-boot jpa spring-data-jpa
2个回答
0
投票

您可以像往常一样通过例如db迁移来添加Sql函数,并扩展org.hibernate.dialect(例如,参见Postgis的用法),并且不要忘记为数据源指定方言

 public class YourDialect extends PostgreSQL95Dialect {
          public YourDialect() {
            super();
            registerFunction("haversine", new StandardSQLFunction("haversine", StandardBasicTypes.DOUBLE));
      }
}

0
投票

您必须在数据库中创建一个函数。函数是“静态”元素-在查询执行时它们必须出现在数据库中。

而且,您的方法有一些错误。在查询中,您从表“ MyClass”中选择,但是您的方法返回“ List”。

© www.soinside.com 2019 - 2024. All rights reserved.