【问题标题】:SpringBootJpa in clause with subMatchingSpringBootJpa in 子句与 subMatching
【发布时间】:2019-10-12 06:05:30
【问题描述】:

如何在spring boot jpa中应用with 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);

【问题讨论】:

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


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2012-05-21
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多