3
多対多の関係にあるUser
とEvent
の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;
:
@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)
れる私問題?
を正規のメタモデルを使用する:これは、あなたの結合を作成するために使用しなければならない分野である は<イベント、このUserEvent>ユーザー= root.join(Event_.users、JoinType.INNER)に参加します。 – perissf