У меня есть такой объект сущности
@Entity
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "user_ratings", schema = "postgres_app")
public class UserRatings extends Auditable<String> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_ratings_sequence")
private Integer userRatingsSequence;
@Column(name = "userid")
private String userid;
// other fields removed for brevity
....
}
У меня есть подобный репозиторий Spring Data Jpa для вышеуказанной сущности
@Repository
public interface UserRatingsRepository extends JpaRepository<UserRatings, Integer> {
String query = "SELECT ur1.* FROM postgres_app.user_ratings ur1 JOIN postgres_app.ratings_eligibility re ON re.hobbies = ur1.hobbies" +
" where ur1.userid = :userid and ur1.is_rated = false" +
" UNION" +
" SELECT ur2.* FROM postgres_app.user_ratings ur2" +
" where ur2.userid = :userid and ur2.is_rated = true";
@Query(value = query, nativeQuery = true)
Page<UserRatings> findAllRowsByUserId(@Param("userid") String userid, Pageable pageable);
}
Примечание: здесь не было объекта poj Rating_eligibility для краткости.
Теперь в моем контроллере я использую стандартную нумерацию и сортировку Spring Boot, и я добавил jpa's show- sql в true, и это запрос, который запускает Spring Boot.
SELECT
ur1.*
FROM
postgres_app.user_ratings ur1
JOIN
postgres_app.ratings_eligibility re
ON re.hobbies = ur1.hobbies
where
userid = ?
and ur1.is_rated = false
UNION
SELECT
ur2.*
FROM
postgres_app.user_ratings ur2
where
userid = ?
and ur2.is_rated = true
order by
ur1.logged_date asc,
ur1.hobbies asc,
ur1.userid asc limit ?
Как видите, я выполняю какой-то сложный запрос (использующий некоторые из моих бизнес-логи c, например, объединение с другой таблицей и т. Д. c), и как только я закончу с этим, я хочу, чтобы моя нумерация страниц работала. Но если вы посмотрите на order by
, вы увидите, что нумерация страниц в Spring по-прежнему использует псевдоним ur1
вместо того, чтобы упорядочивать весь запрос. Поэтому я получаю сообщение об ошибке:
Caused by: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "ur1"
Поэтому вместо генерации вышеуказанного запроса я хочу, чтобы Spring Data Jpa разбирал нумерацию страниц следующим образом (или аналогичным):
SELECT * from (SELECT
ur1.*
FROM
postgres_app.user_ratings ur1
JOIN
postgres_app.ratings_eligibility re
ON re.hobbies = ur1.hobbies
where
userid = ?
and ur1.is_rated = false
UNION
SELECT
ur2.*
FROM
postgres_app.user_ratings ur2
where
userid = ?
and ur2.is_rated = true ) ur
order by
ur.logged_date asc,
ur.hobbies asc,
ur.userid asc limit ?