Spring Data JPA查询报错:String类型无containing属性解决方案咨询
解决Spring Data JPA的PropertyReferenceException异常
问题原因
你遇到的org.springframework.data.mapping.PropertyReferenceException: No property 'containing' found for type 'String'异常,根源在于Spring Data JPA无法解析你的查询方法命名:
findAllByNameContaining(List<String> names):Containing后缀仅支持单个字符串参数的模糊查询(生成LIKE %?1%语句),当参数为集合时,这种命名方式不符合Spring Data JPA的规则。- 你尝试的
findAllByNameContainsIn也不合法:Spring Data JPA没有ContainsIn这种组合后缀,In用于集合的精确匹配,无法和模糊查询的Contains直接结合。
解决方案
根据你的需求(匹配多个流派名称的模糊查询),提供两种可行方案:
方案1:使用@Query自定义JPQL查询
如果查询逻辑固定,直接用@Query编写JPQL语句是最简单的方式:
修改GenreRepository:
public interface GenreRepository extends JpaRepository<GenreModel, Integer> { @Query("SELECT g FROM GenreModel g WHERE " + "(:names IS EMPTY OR EXISTS (SELECT n FROM :names n WHERE g.name LIKE CONCAT('%', n, '%')))") List<GenreModel> findAllByNameContainingAny(@Param("names") List<String> names); }
- 当传入的
names集合为空时,会返回所有流派; - 集合非空时,会匹配名称包含任意一个传入关键词的流派。
方案2:使用JPA Specifications动态构建查询
如果后续需要添加更多动态查询条件(比如结合其他字段过滤),JPA Specifications会更灵活:
- 让
GenreRepository继承JpaSpecificationExecutor:
public interface GenreRepository extends JpaRepository<GenreModel, Integer>, JpaSpecificationExecutor<GenreModel> { }
- 编写Specification工具类:
public class GenreSpecifications { public static Specification<GenreModel> nameContainsAny(List<String> names) { return (root, query, criteriaBuilder) -> { if (names == null || names.isEmpty()) { return criteriaBuilder.conjunction(); // 返回全部结果 } List<Predicate> predicates = new ArrayList<>(); for (String name : names) { predicates.add(criteriaBuilder.like(root.get("name"), "%" + name + "%")); } return criteriaBuilder.or(predicates.toArray(new Predicate[0])); }; } }
- 业务层调用示例:
List<String> targetNames = Arrays.asList("动作", "喜剧"); List<GenreModel> genres = genreRepository.findAll(GenreSpecifications.nameContainsAny(targetNames));
是否需要JPA Specifications?
- 如果只是当前的多关键词模糊查询需求,用
@Query更简洁; - 如果未来需要动态组合多个查询条件(比如同时按流派名称、创建时间过滤),JPA Specifications是更好的选择,它能让你灵活拼接查询条件而无需编写大量自定义JPQL。
内容的提问来源于stack exchange,提问作者Vitor Hugo
相关产品推荐
相关产品推荐

