Java-JPA CAN_NOT_JOIN_TO_BASIC

我有两个表:多对多关系中的用户和事件.为此,我使用了第三个表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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值