亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Criteria API / JPQL 中使用具有一對多屬性的 JPA 投影

如何在 Criteria API / JPQL 中使用具有一對多屬性的 JPA 投影

慕碼人8056858 2022-12-21 12:58:23
我在使用 Criteria API 創建查詢時遇到困難,該查詢投射被查詢實體的屬性并實例化 DTO。其中一個投影屬性映射了與另一個實體的一對多關系,因此它是一組依賴實體。我正在使用 fetch join 來檢索集合。但我收到以下錯誤:org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list我已經嘗試使用常規連接,但在這種情況下,不會填充依賴實體集。完全刪除連接和/或提取也無濟于事。我正在使用 JPA 規范 2.0、Hibernate 4.2.21.Final、Spring Data JPA 1.10.11.RELEASE。有人可以就此給我建議嗎?我也會為一個工作的 JPQL 感到高興。這是我的查詢實現:@Overridepublic List<EntityADto> findByPartialKey1OrderByPartialKey2(String partialKey1) {    // Create query    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();    final CriteriaQuery<EntityADto> criteriaQuery = criteriaBuilder.createQuery(EntityADto.class);    // Define FROM clause    final Root<EntityA> root = criteriaQuery.from(EntityA.class);    root.fetch(EntityA_.oneToManyAttribute);    // Define DTO projection    criteriaQuery            .select(criteriaBuilder.construct(                    EntityADto.class,                    root.get(EntityA_.id).get(EntityAId_.partialKey1),                    root.get(EntityA_.id).get(EntityAId_.partialKey2),                    root.get(EntityA_.stringAttribute1),                    root.get(EntityA_.stringAttribute2),                    root.get(EntityA_.oneToManyAttribute)))            .orderBy(criteriaBuilder.asc(root.get(EntityA_.id).get(EntityAId_.partialKey2)))            .distinct(true);    // Define WHERE clause    final ParameterExpression<String> parameterPartialKey1 = criteriaBuilder.parameter(String.class);    criteriaQuery.where(criteriaBuilder.equal(root.get(EntityA_.id).get(EntityAId_.partialKey1), parameterPartialKey1));    // Execute query    final TypedQuery<EntityADto> typedQuery = entityManager.createQuery(criteriaQuery);    typedQuery.setParameter(parameterPartialKey1, partialKey1);    return typedQuery.getResultList();}
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

連接為您提供 sql 中的行結果集合:


Parent    Child

p1        c1

p1        c2

p1        c3

等等。沒有將生成的集合傳遞給構造函數的機制。


JPA 規范 4.14


constructor_expression ::=

NEW constructor_name ( constructor_item {, constructor_item}* )


constructor_item ::=

single_valued_path_expression |

scalar_expression |

aggregate_expression |

identification_variable

此外,另一個問題是您的查詢可能會返回多個父項或子項。


Parent    Child    Child2

p1        c111     c121

p1        c121     

p1        c131     c122

p2        c211     c211

p2        c221     c212

p2        c231     

我猜這是因為對于底層 JPA 提供者來說,它變得太復雜了,以至于不知道在哪里拆分它,或者使用哪些值來傳遞給子構造函數,或者可能是我不熟悉的更微妙的原因。最重要的是,它要求您提供用于解析此矩陣的代碼,如果您打算這樣做,您也可以在沒有 JPA 的情況下解析結果。


查看完整回答
反對 回復 2022-12-21
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號