2012-01-06 8 views
3

多対多の関係にあるUserEventの2つのテーブルがあります。このため私は3番目のテーブルUserEventを使用しましたが、これにはいくつかの追加の列があります。イベントのためJPA CAN_NOT_JOIN_TO_BASIC

:ユーザーのための

@Id @GeneratedValue int id;

@OneToMany(mappedBy="event") private List<UserEvent> users;

:JPAに、私は次のような関係を持っている理由です

@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) 

れる私問題?

答えて

3

結合は、常に関連付けで行う必要があります。 EventとUserEventの間の関連付けは、フィールドusersによってマップされます。

Join<Event, UserEvent> user = root.join("users", JoinType.INNER); 
+0

を正規のメタモデルを使用する:これは、あなたの結合を作成するために使用しなければならない分野である は<イベント、このUserEvent>ユーザー= root.join(Event_.users、JoinType.INNER)に参加します。 – perissf