2016-05-25 8 views
1

Ich habe versucht, diese QueryDsl durch Verwendung zu lösen, aber es funktioniert nicht, dass ich in dieser Frage Spring data and QueryDsl, how to find by multiple criteria in one row and a OneToMany relationship fragte, wie durch mehr optionalen Kriterien und eine OneToMany Beziehung finden mit Spring

Das Problem ist, ich habe zwei Tabellen eine Person und ihre Kleider.

PersonID |PersonFirstname|PersonLastname 
======================================== 
1  |Jack   |  Jackson 
2  |Kelly   |  Kellson 

die Person Tabelle könnte dann (OneToMany von PersonId)

ID | PersonID | Jacket | Color | Size 
======================================== 
1 |1   |Nike | black | XL 
2 |1   |ADIDAS | white | XL 
3 |1   |Prada | green | L 
4 |1   |ADIDAS | blue | XL 

5 |2   |Reebock | yellow| S 
6 |2   |Majestic| brown | XS 
7 |2   |Prada | green | M 

Aus meiner anderen Frage: Wenn ich jetzt eine Abfrage wie diese

findPersonWho.and(person.personClothes.any().jacket.eq("Nike") 
       .and(person.personClothes.any().color.eq("black")) 
       .and(person.personClothes.any().size.eq("L"))); 

Es wird schreiben gib mir die Person mit der ID 1 zurück, denn er hat eine Jacke von Nike und eine Farbe schwarz und eine Größe L.

Aber ich will nur Patient 1, wenn er eine Jacke von Nike mit der Farbe schwarz hat und die Größe L.

Jetzt habe ich versucht, dies auf eine andere Art und Weise zu tun, schrieb ich eine neue Methode Suche nur in der Kleidung Tabelle wie diese

if (jacket != null) { 
     findPerson.and(p.jacket.eq("Nike").and(p.ecolor.eq("black").and(p.size.eq(L)))); 
} 

und das funktioniert, aber wenn ich will jetzt die BooleanBuilder verwenden, indem mehr Kriterien in dieser Tabelle wie eine weitere Person mit einer Jacke von Reebock in der Farbe gelb zu finden und die Größe s wie folgt:

if (jacket1 != null) { 
     findPerson.and(p.jacket.eq("Nike").and(p.ecolor.eq("black").and(p.size.eq(L)))); 
} 
if (jacket2 != null { 
     findPerson.and(p.jacket.eq("Reebock").and(p.ecolor.eq("yellow").and(p.size.eq(S)))); 

Dies wird mir 0 zurückgeben, aber in Wirklichkeit gibt es zwei Übereinstimmungen. Aber ich denke er sucht jetzt nach der ID und nicht nach der PationID. Es gibt also keine ID 1 mit Standtreffern.

Gibt es eine Möglichkeit, diese Suche durchzuführen? vielleicht mit einem anderen Ansatz? Nach

Antwort

0

Versuchen und ersetzen Suchen mit was auch immer Sie

suchen möchten
Criteria person = sf.getCurrentSession().createCriteria(Person.class).createAlias("personId", "personId"); 

person.add(Restrictions.disjunction().add(Restrictions.ilike("PersonFirstname",Search,MatchMode.ANYWHERE)) 
.add(Restrictions.ilike("personId.Jacket",Search,MatchMode.ANYWHERE)) 
.add(Restrictions.ilike("personId.Color",Search,MatchMode.ANYWHERE)) 
.add(Restrictions.ilike("personId.Size",Search,MatchMode.ANYWHERE))); 
+0

was „sf“ dies kann nicht aufgelöst werden. – Dusius

+0

ist es Ihre Sitzung –