使用Spring Data进行复杂查询

时间:2016-04-05 00:50:10

标签: spring spring-boot spring-data

我使用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

1 个答案:

答案 0 :(得分:0)

我终于开始工作了。这就是我在Repository界面中所做的:

ORG    $1000
START:                  ; first instruction of program

MOVE.W  #0,D1           ;PUT 0 IN D1 (X)
MOVE.W  #1,D2           ;PUT 1 IN D2 (Y)

LOOP CLR.W   D3        ;Find the remainder
     MOVE.W  D1,D3
     DIVU    #2,D3
     SWAP    D3

     CMP     #0,D3      ;Compare remainder with 0
     BEQ     EQUAL      ;If equal, then go to equal

     ADD.W   #1,D2      ;Y++
     ADD.W   #1,D1      ;X++

     CMP     #11,D1     ;Compare D1 with 11
     BEQ     DONE       ;If D1 equals 11, break loop.      
     BRA     LOOP


EQUAL MULU.W  D1,D2     ;Multiply D1 and D2 and store it in D2
      ADD.W   #1,D1     ;X++
      CMP     #11,D1    ;Compare D1 with 11
      BEQ     DONE      ;If D1 equals 11, break loop. 
      BRA     LOOP


DONE LEA MESSAGE,A1
     MOVE.W #14,D0
     TRAP #15

     MOVE.W  D2,D1

     MOVE.W #3,D0
     TRAP #15


    SIMHALT             ; halt simulator

MESSAGE DC.W    'Y is: ',0


    END    START        ; last line of source

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