Spring JPA: не удалось извлечь ResultSet, ОШИБКА: синтаксическая ошибка в или около "{"

Я пытаюсь получить список разбитых на страницы данных с помощью @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;
}

Я искал ответы, но безрезультатно, пожалуйста, в чем может быть проблема.

2 ответа

Решение

Просто удалите #{#pageable} из запроса. Подобные вещи были обходным путем для ошибки в Spring Data JPA, которая исправлена ​​в текущих версиях.

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

@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 реальным комментарием.

Другие вопросы по тегам