JPA CriteryQuery внутреннее соединение - IllegalStateException - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующий критерий запроса в JPA:

      CriteriaBuilder cb2 = entityMager.getCriteriaBuilder();
      CriteriaQuery<DemoUser> cqInnerJoin = cb2.createQuery(DemoUser.class);
      Root<DemoUser> root = cqInnerJoin.from(DemoUser.class);
      Join<DemoUser, DemoOrder> join = root.join("userId", JoinType.INNER);

Но выдает исключение:

Exception in thread "main" 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:354)
    at org.eclipse.persistence.internal.jpa.querydef.FromImpl.join(FromImpl.java:513)
    at jpaTest.jpaTest.main(jpaTest.java:144)

Я создал эти классы из таблиц базы данных Oracle. Что-то не так с моим кодом?

Я пробовал это в TypedQuery, но оно отображало то же сообщение об ошибке.

Сгенерированные классы:

DemoUser.class

 @Entity
    @Table(name="DEMO_USERS")
    public class DemoUser implements Serializable {
        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="USER_ID")
        private long userId;

        //bi-directional many-to-one association to DemoOrder
        @OneToMany(mappedBy="demoUser")
        //@JoinColumn(name = "USER_ID")
        private List<DemoOrder> demoOrders;

Класс DemoOrder

@Entity
@Table(name="DEMO_ORDERS")
public class DemoOrder implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ORDER_ID")
    private long orderId;

    @Temporal(TemporalType.DATE)
    @Column(name="ORDER_TIMESTAMP")
    private Date orderTimestamp;

    @Column(name="ORDER_TOTAL")
    private BigDecimal orderTotal;

    //bi-directional many-to-one association to DemoCustomer
    @ManyToOne
    @JoinColumn(name="CUSTOMER_ID")
    private DemoCustomer demoCustomer;

    //bi-directional many-to-one association to DemoUser
    @ManyToOne
    @JoinColumn(name="USER_ID")
    private DemoUser demoUser;

    //bi-directional many-to-one association to DemoOrderItem
    @OneToMany(mappedBy="demoOrder")
    private List<DemoOrderItem> demoOrderItems;

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Когда требуется присоединиться, вы всегда должны осознавать, что это необходимо для ассоциации . Связь между DemoOrder и DemoUser отображается полем demoUser (как вы взяли DemoUser как root ), так что вот что вы должны сделать:

Join<DemoUser, DemoOrder> join = root.join("demoUser", JoinType.INNER);
0 голосов
/ 05 сентября 2018

Вы не можете присоединиться к атрибуту "userId", который имеет базовый тип (long). Для единственного атрибута вы можете присоединиться к типу Entity или Embeddable.

...