JPA Criteria API - 如何获取"弱"集合

时间:2016-01-29 00:08:30

标签: api jpa collections criteria fetch

作为一些背景知识,我使用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做太多事情?

1 个答案:

答案 0 :(得分:0)

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