【发布时间】:2023-03-13 09:04:02
【问题描述】:
我在创建正确的 JPQL 查询以通过下表加入时遇到问题:
虽然在 GROUPS 和 USERS 之间有一个常规的 @ManyToMany 映射表,但 DOCUMENTS_GROUPS 是导致问题的原因。正如您在以下实体中看到的那样,我希望将 DOCUMENTS 和 GROUPS 之间的关系映射为包含 access_mode 的地图(有效很好,除了查询):
@Entity
@Table(name = "DOCUMENTS")
@NamedQueries({
@NamedQuery(
name = "Documents.findAccessibleByUser",
query = "SELECT d FROM Document d INNER JOIN d.groups g INNER JOIN KEY(g).members m WHERE m.id = :userId"
)
})
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ElementCollection
@CollectionTable(name = "DOCUMENTS_GROUPS", joinColumns = {@JoinColumn(name = "document_id")})
@MapKeyJoinColumn(name = "group_id")
@Column(name = "access_mode")
@Enumerated(EnumType.STRING)
private Map<Group, AccessMode> groups = new HashMap<>();
/* ... */
}
Group 比较正常:
@Entity
@Table(name = "GROUPS")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(length = 255)
private String name;
@ManyToMany
@JoinTable(name = "USERS_GROUPS", //
joinColumns = {@JoinColumn(name = "group_id")}, //
inverseJoinColumns = {@JoinColumn(name = "user_id")} //
)
private Set<User> members = new HashSet<>();
/* ... */
}
我现在的问题是:我需要如何修改 JPQL 查询中的第二个 JOIN?
SELECT d FROM Document d
INNER JOIN d.groups g
INNER JOIN KEY(g).members m
WHERE m.id = :userId
语法错误(在INNER JOIN 之后出现意外的KEY)。
当然,我已经尝试过普通的INNER JOIN g.members m,但由于我们处理的是Map<Group, AccessMode>,所以cannot dereference scalar collection element: members 会失败。
【问题讨论】: