2016-03-29 7 views
0

Ich habe die unten stehende Tabelle:Wie erstellt man eine JPA-Abfrage?

enter image description here

Ich möchte eine Abfrage mit den folgenden Regeln bilden: product1 Erhalten wo Typ nicht Typ1 und nicht Typ2 und Geschmack ist nicht flavor1.

Typ kann Typ 1, Typ 2 oder Null sein.

gebildet ich meine Abfrage wie folgt:

CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder(); 
    CriteriaQuery<Product> searchQuery = cb.createQuery(Product.class); 
    Root<Product> u = searchQuery.from(Product.class); 

    List<Predicate> predicates = new ArrayList<Predicate>(); 

    predicates.add(cb.and(cb.equal(u.get("product"),"product1"),cb.isNull(u.get("type")),cb.notEqual(u.get("flavor"), "flavor1"))); 

Das Problem ist, dass diese Abfrage nichts zurück ... Bin ich etwas fehlt? Bitte beachten Sie, dass sich meine Frage auf die Logik und nicht auf die Syntax bezieht, da die Syntax überprüft wird, indem einfachere Abfragen gebildet werden, die Dummy-Ergebnisse liefern. Vielen Dank!

+0

Zuordnung verwandter Entitäten (wahrscheinlich 'Product'- und' Service'-Mappings). Wenn die Basis Ihrer "where-Klausel" AND ist, fügen Sie Ihren "Prädikaten" Prädikate hinzu, ohne in AND zu springen. – Antoniossss

Antwort

1

Versuchen Sie, die oberste Ebene AND Prädikat zu entfernen. In jedes Prädikat predicates und schaffen where von ihnen mit

predicates.add(cb.equal(u.get("product"),"product1")) 
predicates.add(cb.isNull(u.get("type"))); 
predicates.add(cb.notEqual(u.get("flavor"), "flavor1")); // and so on 

und dann

searchQuery.where(predicates.toArray(new Predicate[predicates.size()]));

Und obendrein, stellen Sie sicher, dass Ihre DB Inhalt für Ihre Abfrage so in der Tat etwas sollte zurückgegeben werden :)

Wie ich in yout "Tabelle" sehen kann, gibt es keine Nullwerte in "Typ" Spalte. Gibt es Nullen in dieser Spalte in der Datenbank? Vielleicht ist es nicht null in der db nur leere Zeichenfolge (und das ist ein großer Unterschied)

+0

Vielen Dank für Ihre Antwort, aber ich habe auch Regeln für die anderen Produkte (Produkt2, etc.), so dass diese Lösung nicht das gewünschte Ergebnis haben wird :( – christinasantz

+0

Nun, ich kann nur zu dem, was Sie uns gezeigt haben, müssen Sie Englisch: www.doc-o-matic.com/webhelp/TdlgEditEdit.html Sie haben Ihre Abfrage in der DB - Umgebung als sql getestet und können versuchen, DB - Aufrufe zu provozieren, um zu überprüfen, welche SQL tatsächlich erzeugt wurde und was ich über NULL - Werte herausgefunden habe? – Antoniossss

+0

Falscher Alarm! Abfrage Ergebnisse in einer Tabelle und ich habe nicht bemerkt, dass die gewünschten Zeilen da waren. Danke trotzdem! – christinasantz

1

Scheint ziemlich einfach. Ich denke, was Sie vermissen ist, dass ein NULL in der Datenbankspalte nur dann übereinstimmt, wenn Sie ihn genau angeben. Mit anderen Worten, wenn Sie type not in ('type1', 'type2') sagen, sind Sie nicht implicity bekommen null Spalten. Sie haben für sie zu fragen, ob Sie sie wünschen:

Mit einer JPQL Abfrage:

List<User> c1 = em.createQuery("select u from User u where (type not in ('type1', 'type2') or type = null) and flavor != 'flavor1'", User.class).getResultList(); 
System.out.println(c1); 

Mit einem CriteriaQuery:

// and with CriteriaQuery 
CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<User> q = cb.createQuery(User.class); 
Root<User> u = q.from(User.class); 
List<String> typeFilter = Arrays.asList("type1", "type2"); 
String flavor = "flavor1"; 
List<User> rs = em.createQuery(q.select(u).where(cb.or(cb.not(u.get("type").in(typeFilter)), cb.isNull(u.get("type"))), cb.notEqual(u.get("flavor"), flavor))).getResultList(); 

Das gibt mir die folgende Ausgabe:

Hibernate: select user0_.id as id1_0_, user0_.flavor as flavor2_0_, user0_.product as product3_0_, user0_.type as type4_0_ from User user0_ where (user0_.type not in ('type1' , 'type2') or user0_.type is null) and user0_.flavor<>'flavor1' 
[[email protected]] 
Hibernate: select user0_.id as id1_0_, user0_.flavor as flavor2_0_, user0_.product as product3_0_, user0_.type as type4_0_ from User user0_ where (user0_.type not in (? , ?) or user0_.type is null) and user0_.flavor<>? 
[[email protected]] 

Hilfreiche Link: How to query a column which value is null in JPA?.

Verwandte Themen