Я хочу сделать запрос, когда я присоединяюсь к двум таблицам, используя CriteriaBuilder. В MySQL запрос, который я пытаюсь сделать, будет выглядеть так:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
AND item.type_id = 1
Я хочу получить все заказы, и если у них есть элемент типа № 1, я хочу присоединиться к этому элементу. Однако, если ни один элемент типа №1 не найден, я все равно хочу получить заказ. Я не могу понять, как это сделать с помощью CriteriaBuilder. Все, что я знаю, как это сделать:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> order = cq.from(Order.class);
Join<Order, Item> item = order.join(Order_.itemList, JoinType.LEFT);
Join<Item, Type> type = order.join(Item_.type, JoinType.LEFT);
cq.select(order);
cq.where(cb.equal(type.get(Type_.id), 1));
Этот запрос сломан, так как он приводит к чему-то подобному в MySQL:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
WHERE item.type_id = 1
Результат будет содержать только заказы с элементами типа №1. Заказы без исключены. Как я могу использовать CriteriaBuilder для создания запроса, как в первом примере?