带子匹配的子句中的SpringBootJpa

时间:2019-05-26 11:03:56

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

如何在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);

1 个答案:

答案 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);
}