JPA Criteria API - 如何添加 JOIN 子句(尽可能通用的句子)

2023-12-05

我正在尝试动态构建查询,我的下一个目标是添加 JOIN 子句(我不知道如何使用 API)。

例如,到目前为止,这段代码对我有用:

...
Class baseClass;   
...
CriteriaBuilder cb = JpaHandle.get().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(this.baseClass);
Root entity_ = cq.from(this.baseClass); 
Predicate restrictions = null;
...
restrictions = cb.conjunction();
restrictions = cb.and(restrictions, entity_.get("id").in(this.listId));
...
cq.where(restrictions);
...
Query qry = JpaHandle.get().createQuery(cq);

(注:JpaHandle 来自 wicket-JPA 实现)

我的愿望是添加 JOIN 子句(尽可能通用)!

我在类中有特定的注释(this.baseClass)

例如 :

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "assay_id", nullable = false)

那么,在标准 JPA 中是否有类似的方法? (注意:这不能编译)

这里有一个实际的失败方法:

...
Join<Experiment,Assay> experimentAssays = entity_.join( entity_.get("assay_id") );

或者像这样:

...
CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
SetJoin<Customer, PurchaseOrder> o = c.join(Customer_.orders);

对我来说,如果它可以尽可能更通用,那就太好了......:

...
Join joinClause = entity_join(entity_.get("assay_id"), entity2_.get("id"));

当然,我在类(this.baseClass)中有特定的注释

感谢您的时间。我将不胜感激各种评论!


也许以下摘录自第 23 章 - 使用 Criteria API 创建查询Java EE 6 教程的部分内容将带来一些启发(实际上,我建议阅读整个第 23 章):

使用联接查询关系

对于导航到相关的查询 实体类,查询必须定义 通过以下方式加入到相关实体 呼叫其中之一From.join方法 在查询根对象或其他对象上join目的。连接方法有 类似于JOINJPQL 中的关键字。

连接的目标使用 类型的元模型类EntityType<T>指定 的持久字段或属性 加入实体。

join 方法返回一个对象 类型Join<X, Y>, where X是个 源实体和Y的目标是 加入。

示例 23-10 连接查询

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);

Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = pet.join(Pet_.owners);

连接可以链接在一起 导航至相关实体 无需创建目标实体 AJoin<X, Y>每个连接的实例。

示例 23-11 将连接链接在一起 在查询中

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);

Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(Pet_.owners).join(Owner_.addresses);

话虽如此,我还有一些补充说明:

首先,在代码中添加以下行:

Root entity_ = cq.from(this.baseClass);

让我觉得你不知何故错过了静态元模型类部分。元模型类,例如Pet_在引用的例子中用于描述元信息一个持久化的类。他们通常是生成的使用注释处理器(规范元模型类)或者可以由开发人员编写(非规范元模型)。但你的语法看起来很奇怪,我认为你正在尝试模仿你错过的东西。

其次,我真的认为你应该忘记这一点assay_id外键,你在这里走错路了。您确实需要开始考虑对象和关联,而不是表和列。

第三,我不太确定添加一个到底是什么意思JOIN 子句尽可能通用以及您的对象模型是什么样子,因为您没有提供它(请参阅上一点)。因此不可能更准确地回答你的问题。

总而言之,我认为您需要阅读更多有关 JPA 2.0 Criteria 和 Metamodel API 的内容,我强烈推荐以下资源作为起点。

See also

  • 这部分6.2.1 静态元模型类在 JPA 2.0 规范中
  • JPA 2.0 中的动态、类型安全查询
  • 使用 Criteria API 和 Metamodel API 创建基本类型安全查询

相关问题

  • 如何生成JPA 2.0元模型?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA Criteria API - 如何添加 JOIN 子句(尽可能通用的句子) 的相关文章

随机推荐

  • 根据半径计算从正方形中心到边缘的矢量

    给定一个正方形 由 x y 宽度 高度描述 和一个角度 以弧度为单位 我需要计算一个向量 该向量源自正方形中心并终止于以给定角度与正方形边缘碰撞的点 我真的对它的碰撞点最感兴趣 所以如果这会使计算更有效 请告诉我 这可以推广到矩形吗 一般而
  • 函数中的动态选择表达式[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个函数来转换此数据框 library dplyr library rlang library purrr df lt data frame obj c 1 1 2 2 3 3 3 4 4 4 S1
  • 更改 IE 中禁用的文本框的字体颜色

    我注意到您可以更改文本框中文本的颜色 这些颜色在 Firefox 中应用一个简单的类被禁用 但在 IE 6 7 中无法找到方法 有没有人有一个优雅的解决方案来实现这一目标 我注意到您可以更改在 Firefox 中禁用的文本框中文本的颜色 我
  • 如何选择带有CUDA的GPU?

    我有一台带有 2 个 GPU 的计算机 我编写了一个 CUDA C 程序 我需要以某种方式告诉它我只想在 2 个显卡中的 1 个上运行它 我需要输入什么命令以及如何使用它 我相信这与cudaSetDevice但我真的不知道如何使用它 应该很
  • 使用 AngularJS 的全局 Ajax 错误处理程序

    当我的网站 100 jQuery 时 我曾经这样做 ajaxSetup global true error function xhr status err if xhr status 401 window location index ht
  • Unix 如何阻止 unix/linux `wall` 消息传递?

    如何阻止unix linuxwall消息传递 Example SSH somemachine WALL annoy the s out of people on machine 期望的目标 拒绝拥有机器上的墙 mesg n 从手册页 DES
  • 从网站获取 IIS 站点 ID

    我在 asp net c 中制作了一个用户控件 由于我需要检索一些数据 我想获取 iis 中用于该站点的站点 ID 这可能吗 如果可能的话 如何实现 Thanks 这将为您提供站点 ID Request ServerVariables IN
  • 创建静态 Mac OS X C 版本

    如何在 Mac OS X 上创建 c 文件的静态构建 当我尝试时 gcc o test Main c static I get ld library not found for lcrt0 o collect2 ld returned 1
  • 应用程序关闭时 Kivy 服务停止

    我正在从我的 Kivy 应用程序启动一项服务 service autoclass net saband myapp ServiceMyservice mActivity autoclass org kivy android PythonAc
  • 是否可以使用密码保护 SQL Server 数据库,甚至免受服务器管理员的攻击?

    我想在某个小公司的本地网络中安装一个应用程序 ASP Net SQL Server 2005 Express 来演示一段时间 但我也不想有人甚至系统管理员对此数据库没有权限 并且任何授予权限都需要我拥有的安全通行证 我只是希望隐藏我的表结构
  • 如何在热图右侧添加自定义刻度

    给定以下示例数据 data q1 6 4 4 4 6 6 6 4 6 6 6 6 q2 3 3 3 4 3 3 4 3 4 3 4 1 q3 6 3 4 4 4 4 6 6 6 6 4 1 q4 3 6 6 6 6 6 4 4 6 4 6
  • PHP cURL HTTP PUT

    我正在尝试使用 cURL 创建 HTTP PUT 请求 但无法使其工作 我读过很多教程 但没有一个真正起作用 这是我当前的代码 filedata array metadata gt rdfxml ch curl init url heade
  • 在 printStackTrace() 上打印完整的调用堆栈?

    我需要编写一个小型日志分析器应用程序来处理我的项目中使用的第三方闭源库 内部有自定义记录器 生成的一些日志文件 如果日志中出现异常条目 我需要收集有关从堆栈跟踪顶部到异常实际位置所涉及方法的聚合信息 不幸的是 默认情况下 Java prin
  • 带有特殊字符的 Firestore 查询属性

    我有一个联系人集合 其结构如下 name XPTO emails email protected Susan email protected Fred 但查询不会返回结果 db firestore collection contacts w
  • TFS 构建工作流程将文件夹/文件属性从只读更改为读/写?

    在我们的一个 Web 应用程序中 要求某些 HTML 页面可以在我们为用户创建的 GUI 界面中进行编辑 不幸的是 该接口直接从服务器上的页面 也在 wwwroot 中 读取 写入 服务器上的另一个页面从中读取并显示它 我现在所做的是改变了
  • 报表生成器导出为带有列标题空格的 CSV

    这是一个奇怪的请求 因为我们都知道数据库标头不应包含空格 然而 我正在使用的系统需要在其标题中包含空格才能导入 我创建了一个报告生成器报告 它将数据构建到一个表中 并在运行时工作 01 08 2015 Active date 31 07 2
  • 单击另一个程序中的按钮 - FindWindow、C#

    我正在尝试创建一个能够控制另一个程序 在 Windows 中 的程序 我找到了这段代码 Get a handle to an application window DllImport USER32 DLL CharSet CharSet U
  • PHP 在文档根目录之外写入

    我正在尝试在 Web 服务器文档根目录之外的目录中创建一个文件 该文件夹的权限为 777 但 php 表示权限被拒绝 警告 fopen home site2 public html images x jpg function fopen 无
  • Java ReplaceAll:无法用反斜杠替换字符串

    在我的 Java 程序中 我试图替换字符串中包含反斜杠的子字符串 paloalto to sanjose 但是 即使我使用双反斜杠来减轻反斜杠作为转义字符的影响 我仍然收到以下错误 Exception in thread main java
  • JPA Criteria API - 如何添加 JOIN 子句(尽可能通用的句子)

    我正在尝试动态构建查询 我的下一个目标是添加 JOIN 子句 我不知道如何使用 API 例如 到目前为止 这段代码对我有用 Class baseClass CriteriaBuilder cb JpaHandle get getCriter