作为一些背景知识,我使用Spring Data JPA规范来动态构建查询。规范使用JPA Criteria API。
我认为我的问题的核心是我需要在桌面上执行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;
}
我需要能够获取tableBSet集合而不会产生N + 1个查询。我在EclipseLink中尝试过@BatchFetch和@JoinFetch注释而没有正面结果。我尝试在Critera中使用两个根并添加 -
builder.equal(tableARoot.get(TableAEntity_.id),
tableBRoot.get(TableBEntity_.tableA).get(TableAEntity_.id))
尝试在SQL中手动执行正确的连接但是也没有工作。
踢球者正在改变关系的强大一面并不是一个选择,因为我还需要能够反过来这样做。我有两个使用实体的API,它需要在两种情况下都返回与父项相关的Set或单个实体。
我正在使用的设计比这更复杂,每个实体都有多个关系,并且需要为大多数实体获取集合,这些集合因API接收到的某些参数而异。
此时,我已经选择了框架,并且需要使用JPA Criteria API对Spring Data Specifications进行高效工作。
我是Criteria API的新手,我已经阅读了所有内容,但我们无法实现在没有N + 1查询的情况下获取弱集合的解决方案。我觉得梳理根是唯一的方法(我知道它不是很好,因为我最终会得到笛卡尔产品),但我无法完成这项工作。 fetch()和join()似乎没有帮助,因为我只能做左连接。
这样做的最佳方法是什么,或者我是否尝试使用Criteria API做太多事情?
答案 0 :(得分:0)
@JoinFetch或root.fetch()是正确的方法。我正在分页结果,这使得看起来由于多个表的产品中的重复行而没有返回数据。我必须创建一个自定义分页来查询请求页面的ID以解决此问题。