JPQL查询含嵌入式对象列表的实体报错,求正确写法
解决嵌入式字段的JPQL IN查询问题
直接修正你的自定义JPQL查询,将WHERE条件中的=替换为IN即可:
@Query("select p " + "from Person p " + "left join fetch p.status status " + "where p.identifier IN :identifiers") List<Person> findByIdentifierIn(@Param("identifiers") List<Identifier> identifiers);
错误原因说明
你之前的写法p.identifier = :identifiers仅能适配单元素列表场景(此时JPA会自动将列表中的单个对象作为匹配项),但传入多元素列表时,=运算符无法处理集合类型参数,再加上嵌入式字段是多列组成的复合结构,会导致参数绑定过程中出现列索引不匹配的错误。
改用IN :identifiers后,JPA会正确解析嵌入式字段的所有属性列,生成与Spring Data JPA自动生成方法一致的SQL——即把每个Identifier对象拆解为对应的多列组合,用(列1,列2,列3) IN ((值1,值2,值3), (值4,值5,值6))的格式完成匹配,从而支持多元素列表的查询需求。
内容的提问来源于stack exchange,提问作者Jarosław Wojciechowski
相关产品推荐
相关产品推荐

