【发布时间】:2016-04-05 00:50:09
【问题描述】:
我使用 Spring Boot 和 Spring Data 来执行我的查询。我想在 Spring Data 中创建复杂查询的最佳方法是使用 @Query 注释。但是,我知道我的自定义查询中的 SELECT 字段必须与给定返回类中的字段匹配。
如何创建一个 Spring Data 查询来匹配下面的 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,而不是使用@Query 和nativeQuery=true。所以我做了this 并得到了以下异常:
org.hibernate.hql.internal.ast.QuerySyntaxException:
unexpected token: CensusSectorGroup near line 1, column 318
【问题讨论】:
-
您的
SELECT语句中不能有类似CS.*的内容。如果您使用的是 JPQL,您应该返回的是实体属性或完整的实体。 -
@Bunti 感谢您的回归。
CS.*部分是最简单的部分。我担心distance_in_km不是我的返回类的一部分,并且使用了我认为特定于 MySql 的 LIMIT 1。如何处理? -
好的,刚刚找到this at StackOverFlow,它对
distance_in_km字段有帮助。LIMIT 1怎么样? -
您是否查看了this SO 答案以计算 RADIANS 和 COS。查询本身未指定限制。它在您使用setMaxResults 调用查询时完成。我认为您使用本机 SQL 编写查询并使用
nativeQuery=true选项指定它
标签: spring spring-boot spring-data