2016-04-05 21 views
0

Sorgularımı gerçekleştirmek için Spring Boot ve dolayısıyla Spring Data kullanıyorum. Spring Data'da karmaşık sorguları oluşturmanın en iyi yolunun @Query ek açıklama ile olduğunu düşünüyorum. Ancak, özel sorgumdaki SELECT alanlarının belirli bir getiri sınıfındaki alanlarla eşleşmesi gerektiğini anlıyorum.Yay Verili Karmaşık sorgu

Aşağıdaki SQL ile eşleştirmek için bir Spring Data sorgusunu nasıl oluşturabilirim?

SELECT latitude, longitude, CS.*, 
     111.045* DEGREES(ACOS(COS(RADIANS(:lat)) 
     * COS(RADIANS(CS.lat_centroid)) 
     * COS(RADIANS(:long) - RADIANS(CS.long_centroid)) 
     + SIN(RADIANS(:lat)) 
     * SIN(RADIANS(CS.lat_centroid)))) AS distance_in_km 
FROM CensusSector CS 
ORDER BY distance_in_km ASC LIMIT 1 

PS1: Dönüş nesnem SayımSayıcısı olacak.

PS2: Herhangi bir değişiklik yapabileceğini sanmıyorum ama MySQL ile çalışıyorum.

Düzenleme 1: @Bunti tarafından önerildiği gibi, bunlardan bazılarını denedikten sonra aldığım haberler bunlar. Eğer yerine nativeQuery=true ile @Query kullanmanın this post takip etmek zorunda gönderilen şeyle query.setMaxresults kullanmak için

. Bu yüzden this yaptım ve aşağıdaki özel aldı: Sonunda o çalışma var

org.hibernate.hql.internal.ast.QuerySyntaxException: 
unexpected token: CensusSectorGroup near line 1, column 318 
+0

'SELECT' ifadelerinizde' CS. * 'Gibi bir şeye sahip olamazsınız. Döndüğünüz şey JPQL kullanıyorsanız varlık öznitelikleri veya tam varlıktır. – Bunti

+0

@Bunti Geri dönüşünüz için teşekkürler. CS. * 'Kısmı en kolay olanıdır. Benim endişem, dönüş sınıfımın bir parçası olmayan ve MySql'e özgü olduğuna inandığım LİMİT 1'i kullanan 'distance_in_km' hakkında. Onları nasıl ele alırım? –

+0

Tamam, sadece bu [StackOverFlow'da] bulundu (http://stackoverflow.com/questions/34441163/return-more-data-than-model-contains-using-spring-data#answer-34449345) distance_in_km' alanı. LİMİT 1 'ne dersin? –

cevap

0

. Bu benim Repository arabiriminde yaptığım şey: Yardımınız için teşekkürler @Bunti:

@Query(value = "SELECT g.*, 111.045 * DEGREES(ACOS(COS(RADIANS(:latitude)) * COS(RADIANS(g.latitude)) 
     * COS(RADIANS(:longitude) - RADIANS(g.longitude)) + SIN(RADIANS(:latitude)) * SIN(RADIANS(g.latitude)))) AS distance_in_km FROM CensusSectorGroupt g ORDER BY distance_in_km ASC LIMIT 1", 
     nativeQuery = true) 
CensusSectorGroup findQuadrant(
     @Param("latitude") BigDecimal latitude, @Param("longitude") BigDecimal longitude); 

. Doğal SQL ipucunu takip etmek zorundaydım. JPQL ile çalışmanın bir yolu varsa söyleyemem.