自定义方法排序Spring Data JPA

时间:2017-12-08 09:55:44

标签: java spring hibernate jpa spring-data-jpa

是否有可能使用Java方法对JPA结果进行排序?

我有实体:

java.sql.Array

我的意思是代替编写SQL:

+--------+----------+-----------+
| Name   | Latitude | Longitude |
+--------+----------+-----------+
| A      | x1       | y1        |
| B      | x2       | y2        |
| C      | x3       | y3        |
+--------+----------+-----------+

我已尝试使用Specification,但如何将自定义java方法注入以下使用的EXPRESSION中:

    "  ORDER BY (acos(sin(latitude * $RADIAN) * sin(:latitude * $RADIAN)" +
    "       + cos(latitude * $RADIAN) * cos(:latitude * $RADIAN)" +
    "         * cos((:longitude * $RADIAN) - (longitude * $RADIAN))" +
    "  ) * $EARTH_RADIUS)")
fun findDoctorDepartmentsInRange(@Param("latitude") latitude: Double,
                                 @Param("longitude") longitude: Double)

2 个答案:

答案 0 :(得分:1)

如果您使用的是Spring JPA,则可以使用Sort对象,并且不会将其附加到您的规范中,而是添加到查询中

据我记得sntax会是那样的

repository.findAll(specification,  new Sort(Sort.Direction.ASC, "field"));

修改

我不确定Sort是否支持表达式,所以如果你想在java代码中执行此操作,则需要创建Criteria API查询,这将是类似的

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<SomeClass> query = cb.createQuery(SomeClass.class);
Root<SomeClass> root = query.from(SomeClass.class);
Expression EXPRESSION = <<TypeYourExpression>>;
query.orderBy(cb.asc(EXPRESSION))
query.where(specification.toPredicate(root,query,cb))
List<SomeClass> result = em.createQuery(query).getResultList();

答案 1 :(得分:0)

一般情况下,您无法将Java代码作为ORDER BY表达式。不在SQL或JPA中。

某些数据库(至少是Oracle)允许您在Java中定义存储过程,因此理论上,您可以使用Java编写SP并在import pdfkit url='https://mp.weixin.qq.com/s?__biz=MzA3NDMyOTcxMQ==&mid=2651249314&idx=1&sn=5338576a80a4145b9808ff06cc980c14' path_wkthmltopdf = 'C:/Anaconda3/Lib/site-packages/wkhtmltopdf/bin/wkhtmltopdf.exe' pdfkit.from_url(url=url,output_path='c:/test.pdf',configuration=pdfkit.configuration(wkhtmltopdf=path_wkthmltopdf))' 表达式中使用它。