Ich möchte eine Abfrage, wo ich zwei Tabellen mit dem CriteriaBuilder beitreten. In MySQL die Abfrage versuche ich, wie diese aussehen würde, zu machen:Wie wird ein CriteriaBuilder-Join mit einer benutzerdefinierten "Ein" -Bedingung erstellt?
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
AND item.type_id = 1
Ich möchte alle Aufträge bekommen, und wenn sie ein Element des Typs # 1 haben, möchte ich mit diesem Element verbinden. Wenn jedoch kein Artikel vom Typ # 1 gefunden wird, möchte ich trotzdem die Bestellung erhalten. Ich kann nicht herausfinden, wie man das mit dem CriteriaBuilder macht. Alles, was ich weiß, wie zu machen:
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));
Diese Abfrage pleite ist, da es sich in so etwas wie dies in MySQL Ergebnisse:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
WHERE item.type_id = 1
Das Ergebnis wird nur mit Elementen des Typs # 1 enthalten Aufträge. Bestellungen ohne sind ausgeschlossen. Wie kann ich den CriteriaBuilder verwenden, um eine Abfrage wie im ersten Beispiel zu erstellen?
_Ich möchte alle Bestellungen erhalten und wenn sie einen Artikel vom Typ # 1 haben, sollte dieser Artikel in result_ enthalten sein. Welcher Ergebnistyp möchten Sie? Auftrag? Oder ein Tupel/Multiselect? Was willst du _mehr_ als alle Bestellungen? Bitte erläutern Sie – perissf
Entschuldigung, ich war nicht sehr klar. Ich habe die Beschreibung korrigiert. Ich bin nicht wirklich daran interessiert, den Gegenstand als Teil meines Ergebnisses zu bekommen. Ich möchte nur Bestellungen in meinem Ergebnis. Grundsätzlich möchte ich das Ergebnis basierend auf Artikeln eines bestimmten Typs sortieren und trotzdem Aufträge ohne diese Art von Artikeln erhalten. –
Dies ist mit CriteriaBuilder möglich! Sehen Sie sich meine Antwort an unter – Mitchapp