JPQL JOIN для внешнего ключа вызывает SQLSyntaxErrorException

У меня есть две сущности Order и Customer. Order имеет отношения @ManyToOne с Customer. Однако, когда я объявляю следующий запрос JPQL, я получаю SQLSyntaxErrorException, потому что в сгенерированном SQL отсутствует условие ON.

JPQL:

SELECT o.id,
       o.incrementId,
       o.externalId,
       o.state,
       o.status,
       o.couponCode,
       o.totalDiscount,
       o.total,
       o.originChannel,
       o.branchOffice,
       o.createdAt,
       o.updatedAt,
       c.fullName
FROM Order o
JOIN FETCH Customer c;

Сгенерированный SQL:

select order0_.id             as col_0_0_,
       order0_.increment_id   as col_1_0_,
       order0_.external_id    as col_2_0_,
       order0_.state          as col_3_0_,
       order0_.status         as col_4_0_,
       order0_.coupon_code    as col_5_0_,
       order0_.total_discount as col_6_0_,
       order0_.total          as col_7_0_,
       order0_.origin_channel as col_8_0_,
       order0_.branch_office  as col_9_0_,
       order0_.created_at     as colon0_,
       order0_.updated_at     as col@Entity
@Table(name = "orders")
public class Order {
    
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
    
   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinColumn(name = "customer_id", referencedColumnName = "id", table = "orders")
   private Customer customer;
    
   public Customer getCustomer() {
       return customer;
   }
}
0_, customer1_.full_name as colList<Order>0_ from orders order0_ inner join customers customer1_ on;

Как видите, здесь отсутствует условие on. Я нахожу это странным, потому что это мои сущности:

Порядок (для краткости нерелевантные свойства опущены)

@Entity
@Table(name = "orders")
public class Order {
    
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
    
   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @JoinColumn(name = "customer_id", referencedColumnName = "id", table = "orders")
   private Customer customer;
    
   public Customer getCustomer() {
       return customer;
   }
}

Клиент (для краткости нерелевантные свойства опущены)

Мой вариант использования не требует наличия List<Order> в объекте Customer (я пытался добавить его, но это все равно не решает проблему.

@Entity
@Table(name = "customers")
public class Customer {
    
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
    
   public int getId() {
      return id;
   }
    
   public void setId(int id) {
      this.id = id;
   }
}

Отношения между этими двумя сущностями правильные, потому что они работают, как и ожидалось, когда дело доходит до вставки, обновления и извлечения обычными средствами. Я что-то упустил здесь?


person MorganGlam    schedule 15.09.2020    source источник


Ответы (1)


Попробуйте использовать следующий jpql:

select o from Order o join o.customer

См. также документацию. .

person SternK    schedule 15.09.2020
comment
Спасибо, это сработало, но мне пришлось удалить ключевое слово fetch, потому что я не получаю весь объект Order, а Hibernate жаловался. Связанный ответ по этому поводу: stackoverflow.com/a/12497188/10587134 - person MorganGlam; 15.09.2020