【问题标题】:org.hibernate.QueryException: Space is not allowed after parameter prefix ':'org.hibernate.QueryException:参数前缀“:”后不允许有空格
【发布时间】:2019-06-04 14:28:12
【问题描述】:

我正在尝试执行查询,但得到了 处理程序执行导致的解决异常:org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: Space is not allowed after parameter prefix ':' 。 我按照这里的建议做了 How can I use MySQL assign operator(:=) in hibernate native query? 和这里 : Hibernate exception on encountering mysql := operator 但一样。 休眠版本 5.2.17.Final

ClientRepository.java

@Repository
public interface ClientRepository extends JpaRepository<Client, Long>, JpaSpecificationExecutor<Client> {
@Query( value = "select * from client where center_id in\n" +
    "(select  id  from    (select * from center  order by parent_center_id, id) center_sorted,  (select @pv=:centerId) initialisation\n" +
    "where   find_in_set(parent_center_id, @pv) and  length(@pv:=concat(@pv, ',', id))) or center_id=:centerId;" ,nativeQuery = true)

Page<Client> findAllByCenterId(@Param("centerId") Long centerId, Pageable pageable) ;

}

【问题讨论】:

  • 老实说,您混合了参数和原始字段。您可以先将查询分开并清理整个语句吗?谢谢

标签: spring hibernate jpa native-sql


【解决方案1】:

以前在 Native Query 中使用赋值运算符时,Hibernate 会抛出异常。Hibernate 支持将冒号字符转义而不将其视为参数。 所以,你需要用反斜杠转义:"\\:="

请注意,引用占位符前后不允许有空格。

【讨论】:

  • 我做了:@Query(value = "select * from client where center_id in\n" + "(select id from (select * from center order by parent_center_id, id) center_sorted, (select @pv = :centerId) 初始化\n" + "where find_in_set(parent_center_id, @pv) and length(@pv\:= concat(@pv, ',', id))) 或 center_id = :centerId;" ,nativeQuery = true ) 现在我得到了:编译失败 [ERROR] /home/src/main/java/com/mycompany/hiptest/repository/ClientRepository.java:[24,69] 非法转义字符
  • 我尝试更简单的查询:@Query(value = "select * from client where center_id = :centerId" ,nativeQuery = true) 成功了。
  • 没有。您应该在传递给 Hibernate 的最终 SQL 字符串中转义“\:=”,并且如果脚本是在 Java 代码中动态准备的 - 在 mySqlString.replaceAll(":=", "\\\\:=") 中使用四个斜杠。双重转义 - 用于 Hibernate 和 Java。
猜你喜欢
  • 2015-04-10
  • 2020-03-11
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2019-06-17
  • 2019-08-11
相关资源
最近更新 更多