我有一个创建规范的方法
public static Specification<MovieEntity> getFindPredicate(
final String title
) {
return (final Root<MovieEntity> root, final CriteriaQuery<?> cq, final CriteriaBuilder cb) -> {
final List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(title)) {
final Join<MovieEntity, MovieTitle> title_ = root.join(MovieEntity_.title);
predicates.add(cb.like(title_.get(MovieTitle_.title), "%" + title + "%"));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
}
此规范应发送到JPA存储库
final Page<MovieEntity> movieEntities = this.movieRepository.findAll(
MovieSpecs.getFindPredicate(
title),
page);
这就是奇怪的事情开始发生的地方。如果数据库中存在具有特定标题的对象,则它将返回页面对象上指定数量的对象。因此,如果我输入了页面大小为10的页面,并且数据库中至少有一个具有指定标题的对象,那么JPA方法将向我返回10个相同的对象。
例如,我向自己展示。
我给了标题jonki1
。在数据库中,我只有一个名为jonki1
的对象。
代码:
for (Iterator<MovieEntity> it = movieEntities.iterator(); it.hasNext(); ) {
MovieEntity entity = it.next();
System.out.println(entity.getTitle().getTitle());
}
给我回报
jonki1
jonki1
jonki1
jonki1
jonki1
jonki1
jonki1
jonki1
jonki1
jonki1
10个对象,因为page
大小为10,但数据库中的对象只有一个。为什么会这样?