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

2024-02-24

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

Fetch<> is descendant of Join<> but it can be used in similar manner.

你只需要投射Fetch<> to Join<>它应该适用于 EclipseLink 和 Hibernate

...
Join<MyEntity, RelatedEntity> join = (Join<MyEntity, RelatedEntity>)root.fetch("relatedEntity");
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JPA Criteria API,您可以执行仅产生一个连接的获取连接吗? 的相关文章

随机推荐

  • 如何阻止 Visual Studio“总是”检查解决方案文件?

    显然没有任何原因 每次我打开解决方案时 Visual Studio 都会检查 sln 文件 如果我将它与以前的版本进行比较 没有任何变化 但这确实令人沮丧 因为每个人都检查了解决方案 我使用的是 VS 2008 和 TFS 2008 都是
  • IOS UIImageView 显示为黑色背景

    所以我有这个可扩展的函数UIImages 我用它来初始化UIImageView带有图像 我的问题是 当显示图像时 它周围总是有一个黑色矩形 尽管图像是背景完全透明的 png 这是缩放方法以及初始化UIImageView UIImage im
  • AngularJS 错误:缩小后的 $injector:modulerr

    嘿伙计们我收到一个错误Error injector modulerr当我缩小 Angular JS 1 应用程序时 到目前为止 我已经研究过这是我调用依赖项的方式HomeController但是我不确定我可能哪里出错了 我注意到这里有一些预
  • JavaScript 括号将原始类型转换为对象

    如果数字是原始类型 为什么我可以这样做 gt 12345 toString 12345 括号是将原始类型转换为Number 不 括号只是让解析器理解 不是小数点 12345 toString 也会起作用 每当您访问原始数字的属性时 原始数字
  • 如何在 scrapy pipelines.py 文件中导入 django 模型

    我正在尝试在 pipelines py 中导入一个 django 应用程序的模型 以使用 django orm 保存数据 我在第一个涉及的 django 应用程序 app1 中创建了一个 scrapy 项目 scrapy project 顺
  • 如何更改 MDI 子窗口图标?

    看下图 我已经创建了Sub Window动态地 我尝试使用setWindowIcon函数如下 mdiWindows gt setWindowIcon QIcon icon ico 但效果不佳 另请参阅以下代码 MDI 窗口创建 QWidge
  • 如何使用 Google Apps 脚本显示 Google Drive 图像?

    如果我使用 Google 教程页面中的以下内容来加载图像 则效果很好 第一个 Google 涂鸦 app add app createImage http www google com logos googleburn jpg 但如果我尝试
  • 在控制器中访问另一个 CakePHP 模型的最佳方法是什么?

    假设我有两个这样的控制器Table1sController and Table2sController 对应型号 Table1sModel Table2sModel In the Table1sController 我懂了 this gt
  • 在本机 iPhone 应用程序中的 UIWebView 中使用 InnerHTML 是否存在错误?

    我有一个相当大的 HTML JS CSS 应用程序 在 iPhone 上使用 Safari 作为 Web 应用程序运行时效果非常好 当在本机 iPhone 应用程序中的 UIWebView 中运行相同的应用程序时 在 jQuery 中调用创
  • Vim,如何自动删除“_”的空行?

    怎样才能让Vim总是删除内容到 当我们删除空行时 N dd or d motion EDIT1 例如 我写过 Hello 某处 然后用yy 然后我将光标移动到其他地方 删除一些空白行N dd到 而没有明确指示寄存器 然后我可以走一条正确的线
  • (撰写)Common Lisp

    我们在 P Graham 的 ANSI Common Lisp 第 110 页 中找到了这个函数构建器来实现组合 参数是 n gt 0 带引号的函数名称 我不完全理解它 所以我将在这里引用代码并在下面指出我的问题 defun compose
  • 如何使用 Ionic 4 检测平台

    如何使用 Ionic 4 检测浏览器和移动网络平台 因为当我在桌面浏览器中尝试使用以下代码时 它没有落入 core 健康 状况 if this platform is core alert core platform else alert
  • 返回Task的接口的同步实现

    如同在同步代码中实现需要 Task 返回类型的接口 https stackoverflow com questions 26352034 implementing an interface that requires a task retu
  • 如何不在链接中的元素下划线?

    我试图在链接上加下划线 但 myspan 元素除外 在任何情况下我都不希望在该元素下加下划线 我还想更改 myspan 的颜色 规则似乎并不适用于此 如果我颠倒顺序并且不在 a 下划线而是在 myspan下划线 则似乎适用了规则 我见过此链
  • 在 Node 中使用 Postgres 的 Sequelize 请求查询日期范围

    我想做的是使用 Node js 中的 Sequelize ORM 获取两个日期之间的行 我正在使用 PostgreSQL 问题是 Sequelize 错误地解释了我提出的请求 这是我用来发出请求的代码 const dbresp await
  • 未找到无服务器命令“离线”

    我正在运行我的nodejs代码并且还安装了无服务器 npm i g 无服务器 但是在使用命令运行它时sls offline start CacheInvalidations我收到错误如下 无服务器错误 未找到无服务器命令 离线 您指的是 c
  • Android,.txt 电子邮件附件未通过意图发送

    我正在测试创建一个 txt 文件 然后通过意图将其作为电子邮件附件发送 创建 txt 文件 try String fileName testFileName txt File root new File Environment getExt
  • 从 maven 在 nexus 中部署工件会出现错误“返回代码是:401”?

    我在 Nexus 中部署时收到 401 错误 我没有对已安装的 Nexus 进行任何更改 Nexus 正在运行localhost 8080 nexus我可以使用默认用户 密码登录 当我跑步时mvn deploy我收到这个错误 这是我的 PO
  • 将所有数据框字符列转换为因子

    给定一个包含各种类型列的 预先存在的 数据框 将其所有字符列转换为因子而不影响任何其他类型列的最简单方法是什么 这是一个例子data frame df lt data frame A factor LETTERS 1 5 B 1 5 C a
  • 使用 JPA Criteria API,您可以执行仅产生一个连接的获取连接吗?

    使用 JPA 2 0 似乎默认情况下 没有显式获取 OneToOne fetch FetchType EAGER 字段在 1 N 次查询中获取 其中 N 是包含定义与不同相关实体的关系的实体的结果数 使用 Criteria API 我可能会