gpt4 book ai didi

java - 使用 JPA Criteria API,你能做一个只导致一个连接的 fetch join 吗?

转载 作者:IT老高 更新时间:2023-10-28 20:40:10 25 4
gpt4 key购买 nike

使用 JPA 2.0。似乎默认情况下(没有显式获取), @OneToOne(fetch = FetchType.EAGER) 字段在 1 + N 查询中获取,其中 N 是包含定义关系的实体的结果数到一个不同的相关实体。使用 Criteria API,我可能会尝试避免这种情况,如下所示:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> query = builder.createQuery(MyEntity.class);
Root<MyEntity> root = query.from(MyEntity.class);
Join<MyEntity, RelatedEntity> join = root.join("relatedEntity");
root.fetch("relatedEntity");
query.select(root).where(builder.equals(join.get("id"), 3));

理想情况下,上述内容应等效于以下内容:

SELECT m FROM MyEntity m JOIN FETCH myEntity.relatedEntity r WHERE r.id = 3

但是,条件查询导致根表不必要地连接到相关实体表两次;一次用于获取,一次用于 where 谓词。生成的 SQL 如下所示:

SELECT myentity.id, myentity.attribute, relatedentity2.id, relatedentity2.attribute 
FROM my_entity myentity
INNER JOIN related_entity relatedentity1 ON myentity.related_id = relatedentity1.id
INNER JOIN related_entity relatedentity2 ON myentity.related_id = relatedentity2.id
WHERE relatedentity1.id = 3

唉,如果我只做 fetch,那么我就没有可在 where 子句中使用的表达式。

我是否遗漏了什么,或者这是 Criteria API 的限制?如果是后者,这是否在 JPA 2.1 中得到纠正,或者是否有任何特定于供应商的增强功能?

否则,最好放弃编译时类型检查(我意识到我的示例没有使用元模型)并使用动态 JPQL TypedQueries。

最佳答案

而不是 root.join(...)您可以使用 root.fetch(...)返回 Fetch<>对象。

<删除> Fetch<>Join<> 的后代 但它可以以类似的方式使用。

你只需要转换Fetch<>Join<>它应该适用于 EclipseLink 和 Hibernate

...
Join<MyEntity, RelatedEntity> join = (Join<MyEntity, RelatedEntity>)root.fetch("relatedEntity");
...

关于java - 使用 JPA Criteria API,你能做一个只导致一个连接的 fetch join 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com