如果连接关系在 EmbeddedId 上,如何使用 Criteria API 连接两个表

How to join two tables using Criteria API if join relationship is on EmbeddedId

我有以下 类:

@Entity 
public class EventOrderLine {

  @EmbeddedId   private EventOrderLineId id;

}

@Embeddable
public class EventOrderLineId implements Serializable {

  @ManyToOne
  @JoinColumn(name = "eventid")
  @JsonIgnore
  private Event event;

  @ManyToOne
  @JoinColumn(name = "orderlineid")
  @JsonIgnore
  private OrderLine orderLine;

}


@Entity   
public class OrderLine {

  @OneToMany
  @JoinColumn(name = "orderlineid")
  @JsonIgnore
  private List<EventOrderLine> eventOrderLines = new ArrayList<>()

}

基本上,我试图通过标准 API 连接两个表,但遇到了问题,因为这是我想要做的:

Root eventOrderLine = criteriaQuery.from(EventOrderLine.class);
Join orderLine = eventOrderLine.join("orderLine");

当然这给了我这个问题,因为映射不直接在实体本身上:

Unable to locate Attribute  with the the given name [orderLine] on this ManagedType [com.EventOrderLine]

我一直在尝试调整连接以深入了解 embeddedId,但不确定是否需要更进一步并修改实体的映射方式。我觉得这可能是我遗漏的简单问题,但找不到这个具体问题。

首先尝试获取EventOrderLine实体的属性id然后加入。所以,它会是 -

Root eventOrderLine = criteriaQuery.from(EventOrderLine.class);
Join orderLine = eventOrderLine.get("id").join("orderLine")

event 字段是 EventOrderLineId 而不是 EventOrderLine 的成员。在您的条件查询中,您首先需要导航到 id。问题是 Root.path("id") returns 是 Path 的一个实例,它不允许进一步连接。

诀窍是使用 'fake' 连接 id 字段,如下所示:eventOrderLine.join("id").join("event")

eventOrderLine.get("id").get("event") 可能同样有效,但它不允许您指定连接类型。