使用 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,而不是使用@QuerynativeQuery=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,而不是使用@QuerynativeQuery=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 JPA,复杂原生Query

Spring Data REST 的 QueryDSL 集成可以用来执行更复杂的查询吗?

Spring Data Jpa 复杂查询总结 (多表关联 以及 自定义分页 )

Spring boot 之 使用JPA对数据进行复杂条件的查询

Spring Data JPA 查询结果返回至自定义实体