java - JPA CAN_NOT_JOIN_TO_BASIC

标签 java jpa

我有两个表:UserEvent在多对多的关系中。为此,我使用了第三张表,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;

对于用户事件:

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

我的问题在哪里?

最佳答案

联接必须始终在关联上完成。 Event 和 UserEvent 之间的关联由字段 users 映射。所以这是您必须用来创建连接的字段:

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

关于java - JPA CAN_NOT_JOIN_TO_BASIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762163/

相关文章:

java - Google Cloud 语音 API 中转录的文件大小

java - org.hibernate.MappingNotFoundException : resource: *hbm. 找不到 xml

java - 如何处理以下查询

java - JPA 规范搜索字符串列表包含

java - 为 ManyToOne 关联编写 HQL 查询

java - JPA OneToMany,在控制台或Web应用程序中打印时如何忽略字段ManyToOne

Java出2个字节

java - 如何用其他非数字 java 替换非数字

java - 如何使用对象在 Java 中设置差异?

java - 如何删除 JBoss 工具项目属性中的 JPA 连接?