You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会更灵活:

  1. 让GenreRepository继承JpaSpecificationExecutor:
public interface GenreRepository extends JpaRepository<GenreModel, Integer>, JpaSpecificationExecutor<GenreModel> {
}
  1. 编写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]));
        };
    }
}
  1. 业务层调用示例:
List<String> targetNames = Arrays.asList("动作", "喜剧");
List<GenreModel> genres = genreRepository.findAll(GenreSpecifications.nameContainsAny(targetNames));

是否需要JPA Specifications?

  • 如果只是当前的多关键词模糊查询需求,用@Query更简洁;
  • 如果未来需要动态组合多个查询条件(比如同时按流派名称、创建时间过滤),JPA Specifications是更好的选择,它能让你灵活拼接查询条件而无需编写大量自定义JPQL。

内容的提问来源于stack exchange,提问作者Vitor Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:05:11