Voglio fare una query in cui mi unisco a 2 tabelle, utilizzando il CriteriaBuilder. In MySQL query sto cercando di fare sarebbe simile a questa:Come far aderire un CriteriaBuilder con una condizione "attiva" personalizzata?
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
AND item.type_id = 1
voglio ottenere tutti gli ordini e se hanno un elemento di tipo # 1, voglio unirmi a questa voce. Tuttavia, se non viene trovato alcun elemento del tipo # 1, desidero comunque ottenere l'ordine. Non riesco a capire come farlo con il CriteriaBuilder. Tutto quello che so come fare è:
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));
Questa query è rotto, in quanto si traduce in qualcosa di simile in MySQL:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
WHERE item.type_id = 1
Il risultato conterrà solo ordini con elementi di tipo # 1. Gli ordini senza sono esclusi. Come posso utilizzare CriteriaBuilder per creare una query come nel primo esempio?
_Voglio ricevere tutti gli ordini e se hanno un articolo di tipo # 1, questo elemento deve essere incluso in result_ Che tipo di risultato vuoi? Ordine? O una tupla/multiselect? Cosa vuoi di più di tutti gli ordini? Spiega – perissf
Scusa, non ero molto chiaro. Ho corretto la descrizione. Non sono realmente interessato a ottenere l'oggetto come parte del mio risultato. Voglio solo ordini nel mio risultato. Fondamentalmente, voglio ordinare il risultato sulla base di elementi di un tipo specifico, mentre ricevo ancora ordini senza quel tipo di elementi. –
È possibile con CriteriaBuilder! Guarda la mia risposta qui sotto – Mitchapp