如何在spring boot jpa中像in子句一样应用。下面是该类。
@Table(name="media")
public class Media {
@NotBlank
private String url;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ElementCollection
private Set<String> tagList = new HashSet<String>();
public Media(String urlString) {
this.url = urlString ;
}
}
例如,如果有一个带有tagList [“ mentos”,“ hurre”]的行,而我想搜索“ men”或[“ men”,“ hu”],则该行应该出现? 我已经定义了以下方法,但仅在字符串完全匹配时才返回一行。
Set<Media> findByTagListIn(List<String> tagList);
答案 0 :(得分:1)
您需要按如下所示的规范进行查询:
//MediaRepository
import org.springframework.data.jpa.domain.Specification;
...
List<Media> findAll(Specification<Media> spec);
并在服务类中创建该规范。
//MediaService
List<Media> findMediaByTags(List<String> tags){
Specification<Media> specification = (Specification<Media>) (root, query, criteriaBuilder) -> {
Predicate predicate = criteriaBuilder.conjunction();
for (String tag : tags) {
predicate = criteriaBuilder.and(predicate,
criteriaBuilder.isMember(tag, root.get("tags")));
}
return predicate;
};
return mediaRepository.findAll(specification);
}