我有两个表:多对多关系中的用户和事件.为此,我使用了第三个表UserEvent,其中包含一些其他列.这就是为什么在JPA中我具有以下关系:
活动:
@Id @GeneratedValue int id;
@OneToMany(mappedBy =“ event”)
私有List< UserEvent>用户;
对于用户:
@ID
@GeneratedValue
私人int ID;
@OneToMany(mappedBy =“ user”)
私有List< UserEvent>事件;
对于UserEvent:
@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();
我在加入时收到以下错误:
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之间的关联由字段用户映射.因此,这是创建联接所必须使用的字段:
Join<Event, UserEvent> user = root.join("users", JoinType.INNER);