作为一点背景知识,我正在使用Spring Data JPA规范来动态构建查询。规范使用JPA Criteria API。
我认为我的问题的核心是我需要在一个表上执行一个Right Join,而EclipseLink(我的提供程序)不支持。
举个简单的例子,我们假设-
| 表B| TableB |
| --| ------------ |
| ID(pk)| id (pk) |
| aField| aField |
| 表a id| 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
注解,但没有得到积极的结果。我试着用两个词根在克里泰拉加上-
builder.equal(tableARoot.get(TableAEntity_.id),
tableBRoot.get(TableBEntity_.tableA).get(TableAEntity_.id))
型
尝试在SQL中手动执行右连接,但这也不起作用。
关键是改变关系的强势一面不是一个选择,因为我也需要能够反过来做这件事。我有两个使用实体的API,在这两种情况下,它都需要返回与父对象相关的Set或单个实体。
我正在使用的设计比这个要复杂得多,每个实体上都有多个关系,并且需要获取大多数集合,这些集合根据API接收的某些参数而变化。
在这一点上,我被赋予了所选择的框架,并且需要使用Spring Data Specifications(使用JPA Criteria API)有效地实现这一点。
我是Criteria API的新手,我已经阅读了所有我能读的东西,但还没有能够实现一个解决方案,即在没有N+1个查询的情况下获取弱集合。我觉得梳理根是唯一的方法(我知道这不是很好,因为我最终会得到一个笛卡尔产品),但我无法得到这项工作。fetch()
和join()
似乎没有帮助,因为我只能做左连接。
做这件事的最好方法是什么,或者我是否试图用Criteria API做太多的事情?
1条答案
按热度按时间mqkwyuun1#
@JoinFetch或root.fetch()是正确的方法。我对结果进行分页,这使得它看起来像是由于多个表的产品中的重复行而没有返回数据。我不得不创建一个自定义分页来按ID查询请求页面来解决这个问题。