JPA CAN_NOT_JOIN_TO_BASIC - PullRequest
       6

JPA CAN_NOT_JOIN_TO_BASIC

3 голосов
/ 06 января 2012

У меня есть две таблицы: 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)

Где моя проблема?

1 Ответ

3 голосов
/ 06 января 2012

Объединение всегда должно быть сделано в ассоциации. Связь между Event и UserEvent отображается полем users. Итак, это поле, которое вы должны использовать для создания соединения:

Join<Event, UserEvent> user = root.join("users", JoinType.INNER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...