首页 > 解决方案 > 带有用于字符串列表的弹簧引导规范的 IN 子句

问题描述

我有一个表Media,其中有一列“tagList”,其中包含字符串列表。我正在尝试编写搜索查询的规范。

inputTag如果是并且 tagList 是 ["mentos","bollywood","cinema"],则以下规范工作正常mentos,但如果 inputTag 是“men”,则它不会返回任何行。如何用 in 替换 isMember 以便它也匹配子字符串。

这是代码:

public class MediaRepositoryService {

@PersistenceContext
private EntityManager entityManager;

@Autowired
private MediaRepository mediaRepo;

@Transactional
public List<Media> searchMedia(final String inputTag) {
    List<Media> cases = mediaRepo.findAll(MediaSearchSpecificaton.findByCriteria(inputTag));
    return cases;
}

private static class MediaSearchSpecificaton {

    private static Specification<Media> findByCriteria(String inputTag) {

        return new Specification<Media>() {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            @Override
            public Predicate toPredicate(Root<Media> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {

                Predicate predicate = criteriaBuilder.conjunction();
                predicate = criteriaBuilder.and(predicate, criteriaBuilder.isMember(inputTag, root.get("tagList")));

                return predicate;
            }
        };
    }
}

}

标签: javaspring-bootspring-data-jpa

解决方案


你可以JPA's Repository Like query method像这样使用:

将此方法添加到MediaRepository

List<Media> findByTagListContaining(String inputTag);

然后从你的方法中调用它

List<Media> cases = mediaRepo.findByTagListContaining(inputTag);

推荐阅读