Может ли кто-нибудь объяснить мне следующее поведение запросов?
@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();
}
}