Spring数据查询导致参数索引超出范围异常

时间:2019-05-07 17:46:20

标签: jpa spring-data-jpa spring-data

有人可以向我解释查询的以下行为吗?

@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依赖项。 Spring Boot版本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();
    }
}

0 个答案:

没有答案