我想使用 CriteriaBuilder 在连接 2 个表的位置进行查询。在 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 创建像第一个示例中那样的查询?
可以从版本开始2.1
of JPA使用on
method 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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)