У меня есть две таблицы: 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;
для 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();
Я получаю следующую ошибку в 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)
Где моя проблема?