【问题标题】:Complex query with Spring Data使用 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 StackOverFlow,它对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

标签: spring spring-boot spring-data


【解决方案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 一起使用。

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2020-06-25
    • 2019-12-25
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2019-07-01
    相关资源
    最近更新 更多