У меня есть эти классы:
Заказы:
@Table(name = "ORDERS")
public class Order {
@Id
@Column(name = "order_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id", nullable = false)
private Long userId;
@JsonManagedReference
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER)
private Set<OrderDetail> orderDetails;
@JsonManagedReference(value = "order-note")
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER)
private Set<Note> notes;
}
Подробнее
@Table(name = "ORDER_DETAILS")
public class OrderDetail {
@Id
@Column(name = "order_detail_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
@JsonManagedReference
@OneToMany(mappedBy = "orderDetail", fetch = FetchType.EAGER)
private Set<OrderSize> orderSizes;
@JsonManagedReference(value="order-detail-note")
@OneToMany(mappedBy = "orderDetail", fetch = FetchType.EAGER)
private Set<Note> notes;
}
Размеры:
@Table(name = "ORDER_SIZES")
public class OrderSize {
@Id
@Column(name = "order_size_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "order_detail_id")
private OrderDetail orderDetail;
}
Примечания
@Table(name = "NOTES")
public class Note {
@Id
@Column(name = "note_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JsonBackReference(value="order-note")
@ManyToOne
@JoinColumn(name = "order_id", nullable = true)
private Order order;
@JsonBackReference(value="order-detail-note")
@ManyToOne
@JoinColumn(name = "order_detail_id", nullable = true)
private OrderDetail orderDetail;
}
Я хочу выполнить запрос (используя критерии Hibernate) и получить все заказы с соответствующими данными, размерами и примечаниями.
public List<Order> findByUser(Long userId) {
Criteria criteria = createEntityCriteria();
criteria.add(Restrictions.eq("userId", userId));
return (List<Order>) criteria.list();
}
На данный момент Hibernate генерирует n таких запросов:
Hibernate:
select
notes0_.order_detail_id as order_de4_17_0_,
notes0_.note_id as note_id1_15_0_,
notes0_.note_id as note_id1_15_1_,
notes0_.note_text as note_tex2_15_1_,
notes0_.order_id as order_id3_15_1_,
notes0_.order_detail_id as order_de4_15_1_,
order1_.order_id as order_id1_16_2_,
order1_.client_id as client_i2_16_2_,
order1_.company_id as company_3_16_2_,
order1_.delivery_id as delivery4_16_2_,
order1_.discount as discount5_16_2_,
order1_.order_date as order_da6_16_2_,
order1_.order_name as order_na7_16_2_,
order1_.signature as signatur8_16_2_,
order1_.order_status as order_st9_16_2_,
order1_.payment_method_id as payment10_16_2_,
order1_.user_id as user_id11_16_2_
from
NOTES notes0_
left outer join
ORDERS order1_
on notes0_.order_id=order1_.order_id
where
notes0_.order_detail_id=?
Я не смог придумать решение, чтобы получить все, что мне нужно, всего за один запрос.