2017-12-08 1 views
0

Java 메소드를 사용하여 JPA 결과를 정렬 할 수 있습니까?커스텀 메소드 Spring 데이터 정렬하기 JPA

" 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) 

내가 Specification으로 시도했지만 EXPRESSION로 지정 자바 방법을 주입하는 방법을 아래에 사용했습니다 :

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

내가 대신 SQL을 쓰는 의미 :

나는 실체가

query.orderBy(cb.asc(EXPRESSION)) 
+0

EXPRESSION'root.get ("yourFieldName")'에 삽입하려고 했습니까? – mrkernelpanic

+0

"a", "b", "x"의 정의가 없으면 누구도 말할 수 없습니다. 생성 된 SQL (JPA Criteria가 생성하는 것)에서 Java 메소드를 사용할 수 없습니다. 추신 : 귀하가 인용 한 SQL은 유효하지 않습니다 ... ASC가 결국 나타납니다. – DN1

+0

업데이트 : 문제를보다 정확하게 설명했습니다. –

답변

1

Spring JPA를 사용하는 경우 Sort 개체를 사용할 수 있으며 하지 귀하의 사양에 있지만 쿼리에 추가

까지 내가 sntax 내가 Sort이다 표현식을 지원 모르겠어요 그

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

편집

같은 것입니다 기억하는, 그래서 자바 코드에서이 작업을 수행하려면 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(); 
+0

예, 문자열 대신 메서드를 사용하고 싶습니다. –

+0

@NorbertNowak이 경우 저장소를 확장하고 사용자 정의 빌드해야 할 수도 있습니다 criteria API 쿼리를 사용하면'query'에 액세스 할 수있게되므로'expression'을 제공 할 수 있습니다 – user902383

+0

Java 코드로 Query를 대체 할 수 없습니까? –

0

일반적으로 Java 코드를 ORDER BY 표현식으로 사용할 수 없습니다. SQL이나 JPA에는 없습니다.

일부 데이터베이스 (오라클 이상)를 사용하면 Java에서 저장 프로 시저를 정의 할 수 있으므로 이론 상으로는 SP를 Java로 작성하고 ORDER BY 표현으로 사용할 수 있습니다.