2016-04-05 37 views
0

我使用Spring Boot,因此使用Spring Data来执行我的查询。我猜想在Spring Data中创建复杂查询的最佳方法是使用@Query注释。但是,我知道我的自定义查询中的SELECT字段必须匹配给定返回类的字段。Spring数据的复杂查询

如何创建一个Spring数据查询以匹配下面的SQL?

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:我的返回对象将是CensusSector。

PS2:我不认为它可以有任何区别,但我正在使用MySQL。

编辑1:正如@Bunti建议的那样,这些是我尝试了一些他的观点后得到的消息。

为了使用query.setMaxresults您发送的内容我必须按照this post而不是使用@QuerynativeQuery=true。所以,我没有this并得到了以下异常:

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

你的'SELECT'语句中不能有像'CS。*'这样的东西。如果您使用JPQL,您应该返回的是实体属性或完整的实体。 – Bunti

+0

@Bunti谢谢你的回报。 'CS。*'部分是最简单的部分。我关心的是'distance_in_km',它不是我返回类的一部分,并且使用了我认为是特定于MySql的LIMIT 1。如何处理它们? –

+0

好的,刚刚发现[这在StackOverFlow](http://stackoverflow.com/questions/34441163/return-more-data-than-model-contains-using-spring-data#answer-34449345)这有助于' distance_in_km'字段。 'LIMIT 1'如何? –

回答

0

我终于得到它的工作。这是我在Repository界面中所做的:

@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); 

感谢@Bunti的帮助。我确实必须遵循原生的SQL提示。我不能说是否有办法使它与JPQL一起工作。