当前位置: 首页 > 知识库问答 >
问题:

使用JPA Criteria API,您可以执行只产生一个连接的获取连接吗?

华懿轩
2023-03-14

使用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

但是,条件查询会导致根表不必要地与相关实体表联接两次;一次用于fetch,一次用于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子句中使用的表达式。

我是否遗漏了什么,或者这是标准API的限制?如果是后者,JPA 2.1是否对此进行了修正,或者是否有任何特定于供应商的增强功能

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

共有3个答案

东弘扬
2023-03-14
匿名用户

使用根目录。EclipseLink上的fetch()将创建一个具有内部连接的SQL,因为它有3种类型,默认为内部连接。

INNER,  LEFT,  RIGHT;

建议使用CreateQuery。

TypedQuery<T> typedQuery = entityManager.createQuery(query);

编辑:您可以像这样将根转换为From:

From<?, ?> join = (From<?, ?>) root.fetch("relatedEntity");

湛光明
2023-03-14

从JPA 2.1开始,您可以为此使用动态实体图。删除您的获取并指定实体图,如下所示:

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");
query.select(root).where(builder.equal(join.get("id"), 3));
EntityGraph<MyEntity> fetchGraph = entityManager.createEntityGraph(MyEntity.class);
fetchGraph.addSubgraph("relatedEntity");
entityManager.createQuery(query).setHint("javax.persistence.loadgraph", fetchGraph);
蓝宜
2023-03-14

代替root.join(...),您可以使用root.fetch(...)返回Fetch

获取

你只需要投Fetch

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

 类似资料:
  • 问题内容: 使用JPA 2.0。似乎默认情况下(无显式提取),在1 + N个查询中提取字段,其中N是包含定义与不同相关实体的关系的Entity的结果数。使用Criteria API,我可能会尝试避免出现以下情况: 理想情况下,以上内容应等效于以下内容: 但是,条件查询会导致根表不必要地两次关联到相关实体表;一次用于获取,一次用于where谓词。产生的SQL看起来像这样: las,如果我只执行提取操

  • 代码片段如下所示: 如果有人有决议,请帮忙?

  • 我必须跟踪作为数据源bean在Java web服务器中连接的Oracle会话。 假设,在spring框架中,有一个bean: 并且我必须在池的每个连接上调用PL/SQL。 我该怎么做? 请告诉我在mybatis或JDBC中如何做。 谢谢

  • 问题内容: 我们正在使用AWS(EC2)上的简单Hello World节点服务器对节点性能进行基准测试。 无论我们使用什么大小的实例,Node总是在最大1000个并发连接上出现(这不是每秒1000个,但是它可以在1次处理1000个)。此后不久,CPU出现峰值,节点基本冻结。 节点v0.10.5 节点应该能够处理比此更正确的吗?任何想法将不胜感激。 还将文件描述符(软,硬,系统)设置为65096)

  • 我一直在使用ftp在android应用程序的服务器上上传图像,我正在使用以下代码连接ftp。它在Wi-fi中工作正常,但如果我切换到3G或2G连接,就会出现连接超时错误。那么,你能告诉我如何处理这种情况吗。我的客户在Veriozon也面临这个问题,Sprint,ATT网络提供商。它的iPhone版本在所有网络中都运行良好。 代码: 错误: JAVA网ConnectException:无法连接到主机

  • 问题内容: 我能够从 EC2实例* 连接到 VPC中 的 **ElastiCache Redis 实例* 。但是我想知道是否有一种方法可以连接到Amazon EC2实例外部的ElastiCache Redis节点,例如从我的 本地 开发设置或其他供应商提供的VPS实例。 目前,从我的本地设置尝试时: 过了一段时间我才超时。 问题答案: 不,您不能不采取诸如隧道之类的“技巧”,虽然可以通过测试来解决