JPA 条件 API - 如何获取 "weak" 集合

JPA Criteria API - How to fetch "weak" collection

作为背景知识,我正在使用 Spring 数据 JPA 规范来动态构建查询。规范使用 JPA 标准 API。

我认为我的问题的核心是我需要在 table 上执行 Right Join,而 EclipseLink(我的提供商)不支持。

举个简单的例子,假设 -

TableA     TableB
--------    --------
id (pk)     id (pk)
aField      aField
bField      table_a_id

@Entity
@Table(name = "TableA")
public class TableAEntity{

private String id;
private String aField;
private String bField;

@OneToMany(mappedBy = "tableA", , fetch=FetchType.EAGER)
private Set<TableBEntity> tableBSet; 
}



@Entity
@Table(name = "TableB")
public class TableBEntity{

private String id;
private String aField;

@ManyToOne
@JoinColumn(name = "table_a_id", referencedColumnName = "id")
TableAEntity tableA; 
}

我需要能够在不导致 N+1 查询的情况下获取 tableBSet 集合。我在 EclipseLink 中尝试了 @BatchFetch 和 @JoinFetch 注释,但没有得到积极的结果。我试过在 Critera 中使用两个根并添加 -

builder.equal(tableARoot.get(TableAEntity_.id),
tableBRoot.get(TableBEntity_.tableA).get(TableAEntity_.id))

尝试在 SQL 中手动执行右连接,但这也不起作用。

踢球者正在改变关系中强势的一面不是一种选择,因为我也需要能够反过来做到这一点。我有两个 API 使用实体,它需要 return 在这两种情况下都与父实体相关的集合或单个实体。

我正在使用的设计比这个复杂得多,每个实体都有多个关系,并且需要为大多数实体获取集合,这些集合随 API 接收到的某些参数而变化。

在这一点上,我已经选择了框架,并且需要使用 Spring 数据规范高效地工作,它使用 JPA 标准 API。

我是 Criteria API 的新手,我已经阅读了所有我能阅读的内容,但未能实现无需 N+1 查询即可获取弱集合的解决方案。我觉得梳理根是唯一的方法(我知道这不是很好,因为我最终会得到笛卡尔积)但我无法完成这项工作。 fetch() 和 join() 似乎没有帮助,因为我只能进行左连接。

执行此操作的最佳方法是什么,还是我试图对标准 API 做太多事情?

@JoinFetch 或 root.fetch() 是正确的方法。我正在对结果进行分页,这使得数据似乎由于多个表的产品中的重复行而没有返回。我必须创建一个自定义分页来通过 ID 查询请求页面来解决这个问题。