如何使CriteriaBuilder加入自定义"on"条件?

Bjø*_*ldt 22 jpa criteria-api jpa-2.0

我想使用CriteriaBuilder在我加入2个表的地方进行查询.在MySQL中,我想要的查询看起来像这样:

SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
AND item.type_id = 1
Run Code Online (Sandbox Code Playgroud)

我想获得所有订单,如果他们有#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));
Run Code Online (Sandbox Code Playgroud)

此查询已中断,因为它在MySQL中产生类似的结果:

SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
WHERE item.type_id = 1
Run Code Online (Sandbox Code Playgroud)

结果将只包含类型为#1的订单.没有订单被排除在外.如何使用CriteriaBuilder创建第一个示例中的查询?

hzi*_*oun 17

使用该on方法可以做到这一点Join<Z, X> on(Predicate... restrictions);.

这是一个例子:

Root<Order> order = cq.from(Order.class);
Join<Order, Item> item = order.join(Order_.itemList, JoinType.LEFT);
item.on(cb.equal(item.get(Item_.type), 1));
Run Code Online (Sandbox Code Playgroud)

  • 如果这有效,那么将有相当多的本机查询可以被替换。下次我需要加入时我会尝试一下。 (2认同)
  • 如果我们不使用元模型类怎么办?那么如何编写这个查询@hzitoun 你可以更新这个答案吗 (2认同)