【问题标题】:Spring JPA: could not extract ResultSet, ERROR: syntax error at or near "{"Spring JPA:无法提取 ResultSet,错误:“{”处或附近的语法错误
【发布时间】:2018-06-19 14:17:13
【问题描述】:

我正在尝试使用 @query 检索分页数据列表

@Query(value = "SELECT * FROM message WHERE id IN( SELECT max(id) FROM  message WHERE receiver = ?1 OR sender = ?2  group by receiver,sender) AND (receiver = ?1 OR sender= ?2) #{#pageable}",
        nativeQuery = true)

Page<Message>  findDistinctMessages(User sender, User receiver, Pageable pageable);

但是当我调用该方法时,我不断收到错误:

    11:57:43 [thread] WARN  o.h.e.jdbc.spi.SqlExceptionHelper -SQL Error: 0, SQLState: 42601
2018-06-18 11:57:43 [thread] ERROR o.h.e.jdbc.spi.SqlExceptionHelper -ERROR: syntax error at or near "{"
  Position: 162
2018-06-18 11:57:43 [thread] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] -Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
org.postgresql.util.PSQLException: ERROR: syntax error at or near "{"
  Position: 162
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155)

这是我的消息类

   @Entity
@Table(name = "Message")
public class Message extends DefaultEntity {


    @Valid
    @ManyToOne(targetEntity = User.class)
    @JoinColumn(name="sender")
    private User sender;

    @Valid
    @ManyToOne(targetEntity = User.class)
    @JoinColumn(name="receiver")
    private User receiver;


    @NotNull
    private String message;

    @Enumerated(EnumType.STRING)
    private MessageStatus messageStatus;

    private Boolean isRead;
}

我已经搜索了答案,但无济于事,请问可能是什么问题。

【问题讨论】:

    标签: sql pagination spring-data-jpa


    【解决方案1】:

    只需从查询中删除#{#pageable}。这种东西是 Spring Data JPA 中的一个错误的解决方法,该错误在当前版本中已修复。

    https://jira.spring.io/browse/DATAJPA-928

    【讨论】:

      【解决方案2】:
      @Query(value = "SELECT * FROM message WHERE id IN( SELECT max(id) FROM  message WHERE receiver = ?1 OR sender = ?2  group by receiver,sender) AND (receiver = ?1 OR sender= ?2) #{#pageable}",
          nativeQuery = true)
      

       @Query(value = "SELECT * FROM message WHERE id IN( SELECT max(id) FROM  message WHERE receiver = ?1 OR sender = ?2  group by receiver,sender) AND (receiver = ?1 OR sender= ?2)  \n-- #pageable\n",
              nativeQuery = true)
      

      postrges 将 {#pageable}" 作为代码而不是评论,将其更改为 \n-- #pageable\n",将使 postrges 将其视为真正的评论。

      【讨论】:

        猜你喜欢
        • 2017-02-20
        • 2018-01-26
        • 2014-04-26
        • 1970-01-01
        • 2017-07-15
        • 2010-12-24
        • 2016-07-10
        • 2018-11-21
        • 1970-01-01
        相关资源
        最近更新 更多