2017-12-08 8 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にカスタムJavaメソッドを注入する方法を以下で使用しました::

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

編集

ようになります覚えているようなので、これを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(); 
+0

はい、文字列の代わりにメソッドを使用したいと思います。 –

+0

@NorbertNowakこの場合、リポジトリを拡張してカスタムを構築する必要がありますcriteria api queryを実行すると、 'query'にアクセスできるようになり、' expression'を提供することができます – user902383

+0

QueryによってJavaコードを置き換えることは不可能ですか? –

0

一般的にORDER BY式としてJavaコードを使用することはできません。 SQLやJPAにはありません。

いくつかのデータベース(少なくともOracle)では、Javaでストアドプロシージャを定義できるため、理論上はSPをJavaで記述し、それをORDER BY式で使用することができます。

関連する問題