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, которая исправлена в текущих версиях.
@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 реальным комментарием.