QueryDSL中直接查询含OneToMany的Embeddable类报错,如何解决?
QueryDSL查询Embeddable类的问题解答
结论
可以在QueryDSL中查询Embeddable类,但你的写法存在问题,导致了ArrayIndexOutOfBoundsException。
错误原因分析
你的ItemList是Embeddable类,但内部包含@OneToMany关联的集合。当直接查询o.itemList时,QueryDSL无法正确处理这种嵌套集合的Embeddable映射——JPA查询结果处理逻辑中,这类结构不能直接作为查询返回类型,最终触发数组越界异常。
解决方案
方案1:查询实体后提取Embeddable对象
先查询完整的Order实体,再通过getter方法提取ItemList:
JPAQueryFactory query = new JPAQueryFactory(entityManager); QOrder o = QOrder.order; return query.select(o) .from(o) .fetch() .stream() .map(Order::getItemList) .collect(Collectors.toList());
方案2:直接查询集合内的元素
如果实际需要的是Item列表,可直接关联查询集合元素:
JPAQueryFactory query = new JPAQueryFactory(entityManager); QOrder o = QOrder.order; QItem i = QItem.item; return query.select(i) .from(o) .join(o.itemList.itemList, i) .fetch();
补充说明
Embeddable类本身支持QueryDSL查询,但当Embeddable内部包含集合关联时,不能直接将其作为查询返回类型。因为JPA无法将数据库返回的多行集合数据直接映射到单个Embeddable对象中,必须通过实体关联或直接查询集合元素的方式处理。
内容的提问来源于stack exchange,提问作者Guk
相关产品推荐
相关产品推荐

