我有两个表:User
和 Event
在多对多的关系中。为此,我使用了第三张表,UserEvent
其中有一些额外的列。这就是为什么在 JPA 中我有以下关系:
对于事件:
@Id @GeneratedValue int id;
@OneToMany(mappedBy="event")
private List<UserEvent> users;
对于用户:
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy="user")
private List<UserEvent> events;
对于用户事件:
@IdClass(UserEventPK.class)
public class UserEvent {
@Id
private int userId;
@Id
private int eventId;
@ManyToOne
@PrimaryKeyJoinColumn(name="userId", referencedColumnName="ID")
private UserAccountModel user;
@ManyToOne
@PrimaryKeyJoinColumn(name="eventId", referencedColumnName="ID")
private EventModel event;
}
我正在尝试获取 UserEvent.user_id == id
所在的所有事件使用标准:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Event> criteria = criteriaBuilder
.createQuery(Event.class);
Root<Event> root = criteria.from(Event.class);
criteria.select(root);
criteria.distinct(true);
Join<Event, UserEvent> user = root.join("id", JoinType.INNER);
List<Predicate> predicates = new ArrayList<Predicate>();
if (id > 0) {
predicates.add(criteriaBuilder.equal(user.get("userId"), id));
}
if (predicates.size() == 0) {
throw new RuntimeException("no criteria");
} else if (predicates.size() == 1) {
criteria.where(predicates.get(0));
} else {
criteria.where(criteriaBuilder.and(predicates
.toArray(new Predicate[0])));
}
TypedQuery<Event> q = em.createQuery(criteria);
if (id > 0) {
q.setParameter("userId", id);
}
List<EventModel> results = q.getResultList();
我在 Join
收到以下错误:
java.lang.IllegalStateException: CAN_NOT_JOIN_TO_BASIC (There is no English translation for this message.)
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.join(FromImpl.java:355)
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.join(FromImpl.java:512)
at com.maze.service.EventService.getList(EventService.java:86)
at test.MainClass.main(MainClass.java:40)
我的问题在哪里?
最佳答案
联接必须始终在关联上完成。 Event 和 UserEvent 之间的关联由字段 users
映射。所以这是您必须用来创建连接的字段:
Join<Event, UserEvent> user = root.join("users", JoinType.INNER);
关于java - JPA CAN_NOT_JOIN_TO_BASIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762163/