0

我正在尝试使用@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;
}

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

4

2 回答 2

1

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

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

于 2018-06-19T06:17:13.470 回答
0
@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 将其视为真正的评论。

于 2018-06-18T11:59:49.083 回答