Java 左连接到´;行不通

Java 左连接到´;行不通,java,jpa,eclipselink,Java,Jpa,Eclipselink,如何使用JPA/Eclipselink 2.6.5中的三级“左连接”获取表3(关系OneToOne) 此命令不获取它:(错误) 此命令获取它,但不保留第一个“左”:(错误) 这将获取它,但它只有两个级别:(不需要) 表1: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "Id") private Integer id; @JoinColumn(nam

如何使用JPA/Eclipselink 2.6.5中的三级“左连接”获取表3(关系OneToOne)

此命令不获取它:(错误)

此命令获取它,但不保留第一个“左”:(错误)

这将获取它,但它只有两个级别:(不需要)

表1:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "Id")
private Integer id;

@JoinColumn(name = "Table2", referencedColumnName = "Id")
@ManyToOne(fetch = FetchType.LAZY)
private Table2 table2;
表2:

@Id
@Basic(optional = false)
@NotNull
@Column(name = "Id")
private Integer id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "table2")
private Collection<Table1> table1Collection;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "table2")
private Table3 table3;

谢谢

我认为您需要在这里的表1和表2之间进行正确的连接,因此请改用“右连接”重试前两个示例。

JPA/JPQL不支持嵌套的获取连接。为了解决这个问题,您可以向查询中添加一个外部连接,告诉它您想要使用左外部连接连接什么。查询提示有一个更好的示例来说明如何使用它

Query query = em.createQuery("SELECT t1 FROM Table1 t1", Table1.class);
query.setHint("eclipselink.LEFT_FETCH", "t1.table2");
query.setHint("eclipselink.LEFT_FETCH", "t1.table2.table3");

您的各种尝试生成的SQL是什么?EclipseLink 2.4+应该支持JPQL中的嵌套联接获取
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "Id")
private Integer id;

@JoinColumn(name = "Table2", referencedColumnName = "Id")
@ManyToOne(fetch = FetchType.LAZY)
private Table2 table2;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "Id")
private Integer id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "table2")
private Collection<Table1> table1Collection;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "table2")
private Table3 table3;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "Id")
private Integer id;

@JoinColumn(name = "Table2", referencedColumnName = "Id", insertable = false, updatable = false)
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Table2 table2;
Query query = em.createQuery("SELECT t1 FROM Table1 t1", Table1.class);
query.setHint("eclipselink.LEFT_FETCH", "t1.table2");
query.setHint("eclipselink.LEFT_FETCH", "t1.table2.table3");