使用 Spring Data 进行复杂查询
Posted
技术标签:
【中文标题】使用 Spring Data 进行复杂查询【英文标题】:Complex query with Spring Data 【发布时间】: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 ***,它对distance_in_km
字段有帮助。 LIMIT 1
怎么样?
您是否查看了this SO 答案以计算 RADIANS 和 COS。查询本身未指定限制。它在您使用setMaxResults 调用查询时完成。我认为您使用本机 SQL 编写查询并使用 nativeQuery=true
选项指定它
@Bunti,为了将query.setMaxresults
与您发送的内容一起使用,我必须关注this post,而不是使用@Query
和nativeQuery=true
。所以我做了this 并得到了以下异常:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: CensusSectorGroup near line 1, column 318
【参考方案1】:
我终于让它工作了。这是我在我的 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 一起使用。
【讨论】:
以上是关于使用 Spring Data 进行复杂查询的主要内容,如果未能解决你的问题,请参考以下文章
spring data jpa Specification 复杂查询+分页查询
Spring Data REST 的 QueryDSL 集成可以用来执行更复杂的查询吗?
Spring Data Jpa 复杂查询总结 (多表关联 以及 自定义分页 )