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 查询请求页面来解决这个问题。
作为背景知识,我正在使用 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 查询请求页面来解决这个问题。