java - JPA 命名查询显示错误

标签 java mysql sql spring spring-data-jpa

我正在尝试在我的实体上执行 JPA 命名查询,但它显示语法错误。谁能告诉我我的命名查询有什么问题吗?

@Repository
public interface CollegeRepository extends CrudRepository<CollegeEntity, Integer> {


    @Query("SELECT c FROM(SELECT *,(((acos(sin((:latitude * pi()/180)) * sin((latitude*pi()/180))+cos((:latitude * pi()/180)) * cos((latitude*pi()/180)) * cos(((:longitude - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30")
    List<CollegeEntity> getCollegeByLocation(@Param("latitude") Double latitude, @Param("longitude") Double longitude, @Param("distance") Integer distance);    
}

执行上述查询后出现错误。

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 14 [SELECT c FROM(SELECT *,(((acos(sin((:latitude * pi()/180)) * sin((latitude*pi()/180))+cos((:latitude * pi()/180)) * cos((latitude*pi()/180)) * cos(((:longitude - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= :distance]

当我在 MySQL 终端中执行以下 native 查询时,工作正常。

mysql> SELECT * FROM(SELECT *,(((acos(sin((0.0 * pi()/180)) * sin((latitude*pi()/180))+cos((0.0 * pi()/180)) * cos((latitude*pi()/180)) * cos(((0.0 - longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30;
Empty set (0.08 sec)

最佳答案

您的查询似乎不是正确的 JPQL 语法,因为没有 acospisincod JPA 中的 函数,您的查询看起来像 native 查询,要解决您的问题,您有两个选择:

  • 第一个选项:将您的查询转换为正确的 JPQL 语法,您可以遵循documentation
  • 第二个选项:使用nativeQuery = true属性@Query(nativeQuery = true, value="SELECT * FROM(..."),请注意 * 您的查询中没有别名 c

您可以使用:

@Query(value = "SELECT * FROM(SELECT *,"
        + "(((acos(sin((0.0 * pi()/180)) * sin((latitude*pi()/180)) + "
        + "cos((0.0 * pi()/180)) * cos((latitude*pi()/180)) * "
        + "cos(((0.0 - longitude)*pi()/180))))*180/pi()) * "
        + "60*1.1515*1.609344) as distance FROM college) t WHERE distance <= 30;", 
        nativeQuery = true)
<小时/>

就您而言,我强烈建议您选择第二种选择。

关于java - JPA 命名查询显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247471/

相关文章:

java - 处理聊天输入或停止输入事件 (Android)

java - 版本控制 REST API 和供应商特定的内容类型

mysql - 如何仅显示唯一行并从显示列中删除

php - INSERT IGNORE INTO 不起作用

sql - 使用内部SELECT查询“清理”任意SQL?

mysql - 触发在特定日期删除数据库

java - 如何从我的 Controller 获取数据?

java - Sonar 占用太多空间和时间

php - Laravel 关系 - 是否有多个*不必要的*数据库调用?

SQL 递归选择