假设我们有一个基于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
与Haversine 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(...) ...")
,因为我必须在多个自定义查询中使用此功能,并且我尝试防止代码重复。有任何想法吗?
您可以像往常一样通过例如db迁移来添加Sql函数,并扩展org.hibernate.dialect(例如,参见Postgis的用法),并且不要忘记为数据源指定方言
public class YourDialect extends PostgreSQL95Dialect {
public YourDialect() {
super();
registerFunction("haversine", new StandardSQLFunction("haversine", StandardBasicTypes.DOUBLE));
}
}
您必须在数据库中创建一个函数。函数是“静态”元素-在查询执行时它们必须出现在数据库中。
而且,您的方法有一些错误。在查询中,您从表“ MyClass”中选择,但是您的方法返回“ List”。