Результаты запроса данных Spring приводят к тому, что индекс параметра выходит за пределы диапазона Исключение - PullRequest
0 голосов
/ 07 мая 2019

Может ли кто-нибудь объяснить мне следующее поведение запросов?

@Query("select distinct p from PostFeedbackPossibility po INNER JOIN po.post p " +
       "where (upper(po.name) = upper(:possA) ) or exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possB) and poB.post = po.post)" +
       "order by (CASE WHEN upper(po.name) = upper(:possA) and exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possB) and poB.post = po.post) THEN 2 " +
       "WHEN upper(po.name) = upper(:possA) or exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possB) and poB.post = po.post) THEN 1 ELSE 0 END) desc, p.publishTime desc")
    public Page<Post> findPostsByFeedbackPossibilitesName(@Param("possA") String possA,
                                                          @Param("possB") String possB,
                                                          Pageable pageable);

При выполнении метода findPostsByFeedbackPossibilitesName генерируются следующие исключения: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2)

Даже если я намеренно добавляючетыре аргумента метода, чтобы иметь то же количество аргументов метода, что и параметры запроса.Я получаю SQLException: Parameter index out of range (5 > number of parameters, which is 2).

@Query("select distinct p from PostFeedbackPossibility po INNER JOIN po.post p " +
            "where (upper(po.name) = upper(:possA) ) or exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possB) and poB.post = po.post)" +
            "order by (CASE WHEN upper(po.name) = upper(:possC) and exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possD) and poB.post = po.post) THEN 2 " +
            "WHEN upper(po.name) = upper(:possE) or exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possF) and poB.post = po.post) THEN 1 ELSE 0 END) desc, p.publishTime desc")
    public Page<Post> findPostsByFeedbackPossibilitesName(@Param("possA") String possA,
                                                          @Param("possB") String possB,
                                                          @Param("possC") String possC,
                                                          @Param("possD") String possD,
                                                          @Param("possE") String possE,
                                                          @Param("possF") String possF,
                                                          Pageable pageable);

Однако, когда я использую исходный запрос без предложения CASE, он работает как положено.

@Query("select distinct p from PostFeedbackPossibility po INNER JOIN po.post p " +
       "where (upper(po.name) = upper(:possA) ) or exists (select poB from PostFeedbackPossibility poB where upper(poB.name) = upper(:possB) and poB.post = po.post) order by p.publishTime desc")
    public Page<Post> findPostsByFeedbackPossibilitesName(@Param("possA") String possA,
                                                          @Param("possB") String possB,
                                                          Pageable pageable);

Я использую spring-boot-starter-зависимость data-jpa.Пружинная загрузка версии 2.1.3.

Структура Post

@Entity
@Table(name = DBHelper.TablesNames.POST)
@Where(clause = "is_deleted=0")
public class Post extends AbsBaseEntityWithOwner<Long> {

    @Getter
    @Setter
    private String description;

    @Getter
    @Setter
    private long publishTime;

    /**
     * This is a location of this post.
     */
    @Getter
    @Setter
    @ManyToOne
    private GoogleLocation location;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "post", fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @Getter
    @Setter
    private List<PostPhoto> photos;

    @Getter
    @Setter
    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "post", fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<PostFeedbackPossibility> postFeedbackPossibilities;

    @Getter
    @Setter
    @OneToOne
    private PostFeedbackPossibility chosenFeedbackPossibility;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "post")
    @Getter
    @Setter
    private List<Comment> comments = new ArrayList<>();


    @Transient
    @Getter
    @Setter
    private PostFeedbackVote myPostFeedbackVote;


    @Transient
    @Getter
    @Setter
    private List<Comment> mostRecentComment = new ArrayList<>();

    @Getter
    @Setter
    private AccessType accessType;

    @ManyToMany(fetch = FetchType.LAZY)
    @Getter
    @Setter
    private List<User> viewers = new ArrayList<>();

    @Getter
    @Setter
    private boolean isDeleted;


    public Post() {
        super();
    }
}

Структура PostFeedbackPossibility

@Entity
@Table(name = DBHelper.TablesNames.POST_FEEDBACK_POSSIBILITY)
@Where(clause = "is_deleted=0")
public class PostFeedbackPossibility extends AbsBaseEntity<Long> {

    @Getter
    @Setter
    private String name;

    @Getter
    @Setter
    @Transient
    private Integer count;

    @Getter
    @Setter
    @ManyToOne
    private Post post;

    @Getter
    @Setter
    @OneToMany(mappedBy = "postFeedbackPossibility", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<PostFeedbackVote> postFeedbackVoteList = new ArrayList<>();

    @Getter
    @Setter
    private boolean isDeleted;

    public PostFeedbackPossibility() {
        super();
    }
}
...