Spring Data Jpa выдает «ошибка отсутствует в предложении» при использовании нумерации страниц и нативных запросов? - PullRequest
0 голосов
/ 18 января 2020

У меня есть такой объект сущности

@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 ?

1 Ответ

0 голосов
/ 28 января 2020

Как насчет этого?

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 \n#pageable\n";

ИЛИ

String baseQuery = "SELECT ur1.* FROM    postgres_app.user_ratings ur1 JOIN postgres_app.ratings_eligibility re ON re.hobbies = ur1.hobbies where userid = :userId  and ur1.is_rated = false UNION SELECT    ur2.* FROM     postgres_app.user_ratings ur2 where    userid =:userId     and ur2.is_rated = true "


String mainQuery = "SELECT u.* from ("+baseQuery+") u \n-- #pageable\n";

String countQuery = "SELECT count(*) from ("+baseQuery+") u";



@Query(value = query, countQuery=countQuery,nativeQuery = true)
Page<UserRatings> findAllRowsByUserId(@Param("userid") String userid, Pageable pageable);
...