Spring Data JPA @Query创建对象报错:非法尝试解引用集合,如何解决?
错误原因
你写的join a.books.id as booksIds是错误的JPQL语法:a.books是集合类型(Setid属性,只有集合中的单个Book对象才有id。直接在集合上访问id会触发JPA的集合解引用错误。
解决方案
要正确收集每个作者关联的书籍ID集合,需要通过关联实体+聚合函数实现,以下是通用解决方式(需JPA 2.1及以上版本支持):
修改后的@Query代码
@Query(""" select new com.myPackage.AuthorDTO( a.id, a.name, collect(b.id) ) from Author a left join a.books b group by a.id, a.name """) List<AuthorDTO> getAuthors();
关键说明
- 使用
left join a.books b:关联作者对应的书籍实体(用left join可保留无书籍的作者;若仅需查询有书籍的作者,替换为join即可) - 用
collect(b.id):聚合当前作者下的所有书籍ID,生成集合 group by a.id, a.name:按作者唯一标识(id和name)分组,确保每个作者仅返回一条记录,对应其完整的书籍ID集合
兼容旧版本备选方案
若你的JPA实现不支持collect函数,可改用Hibernate特有的elements函数(兼容性较差):
@Query(""" select new com.myPackage.AuthorDTO( a.id, a.name, elements(a.books.id) ) from Author a """) List<AuthorDTO> getAuthors();
优先推荐基于标准JPA collect的实现,兼容性更强。
内容的提问来源于stack exchange,提问作者Anabelle95
相关产品推荐
相关产品推荐

