将连接添加到 JPA CriteriaQuery
Adding a join to a JPA CriteriaQuery
我的 FlowStep 对象上有一个 CriteriaQuery。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<FlowStep> cbQuery = cb.createQuery(FlowStep.class);
Root<FlowStep> flowStep = cbQuery.from(FlowStep.class);
List<Predicate> predicates = new ArrayList<>();
然后我根据要过滤的内容添加许多谓词。
// add all the conditions to query
cbQuery.select(flowStep).where(predicates.toArray(new Predicate[0]));
我什至添加了排序内容。
cbQuery.orderBy(orders);
Query query = em.createQuery(cbQuery);
List<FlowStep> resultList = query.getResultList();
但我需要像这样添加一个连接:
select * from flowstep fs join flowinstance fi on fi.id = fs.flowinstanceid and fi.domainid = 'Test'
所以我只想 return 匹配标准 AND 的流程步骤在测试域中,域信息在 table 流程实例中。
如何将联接添加到 CriteriaQuery?
我看到了类似的东西
Join<FlowStep, UUID> flowStepFlowInstanceJoin = flowStep.join(FlowInstance_.id);
但是我需要在域上添加等于某个值的条件。
是否可以在 JPQL 条件查询中使用像上面这样的连接?
最初的答案是在谓词列表之前添加:
Join<FlowStep, FlowInstance> flowStepFlowInstanceJoin = flowStep.join("id", JoinType.LEFT);
flowStepFlowInstanceJoin.on(cb.equal(flowStepFlowInstanceJoin.get("domainid"), domain));
FlowStep 有一个flowinstanceid 列和字段,flowinstance 有一个id 字段。
这编译但不起作用。
我收到错误消息“无法连接到基本类型的属性”。
那么FlowStep和FlowInstance之间需要一对多的关系吗?
FlowInstance 有很多流程步骤,所以可能
@Column(name = flowinstanceid)
private UUID flowInstanceId;
在 FlowStep class 中需要更改为 JoinColumn?并添加 OneToMany 或 ManyToOne 关系以使上述 JOIN 成为可能?
解决方案由 and 提出。
在classFlowStep中,我们需要添加FlowInstance对象和一个ManyToOne注解:
@JoinColumn(name = FLOW_INSTANCE_ID, insertable = false, updatable = false)
@ManyToOne(targetEntity = FlowInstance.class, fetch = FetchType.EAGER)
@JsonIgnore
private FlowInstance flowInstance;
请注意,class 已经有一个 UUID 类型的流实例 ID 字段,但是 class FlowInstance 字段对于 ManyToOne 关系似乎是必需的。
然后在构建 JPA 查询时:
Join<FlowStep, FlowInstance> flowStepFlowInstanceJoin = flowStep.join("flowInstance", JoinType.INNER);
flowStepFlowInstanceJoin.on(cb.equal(flowStepFlowInstanceJoin.get("domainId"), domain));
这低于
Root<FlowStep> flowStep = cbQuery.from(FlowStep.class);
行。
这使它工作。
连接的类型是 INNER 非常重要,这样它只有 return 具有所需域的步骤。 LEFT 将 return 包含非通缉域的步骤,RIGHT 将 return 与具有通缉域的步骤一样多的空行。
我的 FlowStep 对象上有一个 CriteriaQuery。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<FlowStep> cbQuery = cb.createQuery(FlowStep.class);
Root<FlowStep> flowStep = cbQuery.from(FlowStep.class);
List<Predicate> predicates = new ArrayList<>();
然后我根据要过滤的内容添加许多谓词。
// add all the conditions to query
cbQuery.select(flowStep).where(predicates.toArray(new Predicate[0]));
我什至添加了排序内容。
cbQuery.orderBy(orders);
Query query = em.createQuery(cbQuery);
List<FlowStep> resultList = query.getResultList();
但我需要像这样添加一个连接:
select * from flowstep fs join flowinstance fi on fi.id = fs.flowinstanceid and fi.domainid = 'Test'
所以我只想 return 匹配标准 AND 的流程步骤在测试域中,域信息在 table 流程实例中。 如何将联接添加到 CriteriaQuery?
我看到了类似的东西
Join<FlowStep, UUID> flowStepFlowInstanceJoin = flowStep.join(FlowInstance_.id);
但是我需要在域上添加等于某个值的条件。
是否可以在 JPQL 条件查询中使用像上面这样的连接?
最初的答案是在谓词列表之前添加:
Join<FlowStep, FlowInstance> flowStepFlowInstanceJoin = flowStep.join("id", JoinType.LEFT);
flowStepFlowInstanceJoin.on(cb.equal(flowStepFlowInstanceJoin.get("domainid"), domain));
FlowStep 有一个flowinstanceid 列和字段,flowinstance 有一个id 字段。 这编译但不起作用。 我收到错误消息“无法连接到基本类型的属性”。 那么FlowStep和FlowInstance之间需要一对多的关系吗? FlowInstance 有很多流程步骤,所以可能
@Column(name = flowinstanceid)
private UUID flowInstanceId;
在 FlowStep class 中需要更改为 JoinColumn?并添加 OneToMany 或 ManyToOne 关系以使上述 JOIN 成为可能?
解决方案由
在classFlowStep中,我们需要添加FlowInstance对象和一个ManyToOne注解:
@JoinColumn(name = FLOW_INSTANCE_ID, insertable = false, updatable = false)
@ManyToOne(targetEntity = FlowInstance.class, fetch = FetchType.EAGER)
@JsonIgnore
private FlowInstance flowInstance;
请注意,class 已经有一个 UUID 类型的流实例 ID 字段,但是 class FlowInstance 字段对于 ManyToOne 关系似乎是必需的。
然后在构建 JPA 查询时:
Join<FlowStep, FlowInstance> flowStepFlowInstanceJoin = flowStep.join("flowInstance", JoinType.INNER);
flowStepFlowInstanceJoin.on(cb.equal(flowStepFlowInstanceJoin.get("domainId"), domain));
这低于
Root<FlowStep> flowStep = cbQuery.from(FlowStep.class);
行。 这使它工作。 连接的类型是 INNER 非常重要,这样它只有 return 具有所需域的步骤。 LEFT 将 return 包含非通缉域的步骤,RIGHT 将 return 与具有通缉域的步骤一样多的空行。