Я хочу сделать запрос, в котором я соединяю 2 таблицы, используя 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 для создания запроса, как в первом примере?