gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:43:55 24 4
gpt4 key购买 nike

我正在尝试动态构造查询,我的下一个目标是添加 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)中有特定的注释

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

最佳答案

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

Querying Relationships Using Joins

For queries that navigate to related entity classes, the query must define a join to the related entity by calling one of the From.join methods on the query root object, or another join object. The join methods are similar to the JOIN keyword in JPQL.

The target of the join uses the Metamodel class of type EntityType<T> to specify the persistent field or property of the joined entity.

The join methods return an object of type Join<X, Y>, where X is the source entity and Y is the target of the join.

Example 23-10 Joining a Query

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);

Joins can be chained together to navigate to related entities of the target entity without having to create a Join<X, Y> instance for each join.

Example 23-11 Chaining Joins Together in a Query

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 的内容,我强烈推荐以下资源作为起点。

另请参阅

相关问题

关于java - JPA Criteria API - 如何添加 JOIN 子句(尽可能通用的句子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61812890/

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