如果连接关系在 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")
可能同样有效,但它不允许您指定连接类型。
我有以下 类:
@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")
可能同样有效,但它不允许您指定连接类型。