Я пытался решить эту проблему с помощью QueryDsl, но это не работает. Я задал этот вопрос Данные Spring и QueryDsl, как найти по нескольким критериям в одной строке и отношение OneToMany
Проблема в том, что у меня есть две таблицы Person и его одежда.
PersonID |PersonFirstname|PersonLastname
========================================
1 |Jack | Jackson
2 |Kelly | Kellson
Тогда таблица Person может быть (OneToMany by 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
Из моего другого вопроса: если я сейчас напишу такой запрос
findPersonWho.and(person.personClothes.any().jacket.eq("Nike") .and(person.personClothes.any().color.eq("black")) .and(person.personClothes.any().size.eq("L")));
Он вернет мне Человека с ID 1, потому что у него есть куртка от Nike, черного цвета и размера L.
Но я хочу, чтобы Пациент 1 был только в том случае, если у него есть куртка от Nike черного цвета и размера L.
Сейчас попробовал сделать это другим способом, написал новый метод для поиска только в таблице одежды вот так
if (jacket != null) {
findPerson.and(p.jacket.eq("Nike").and(p.ecolor.eq("black").and(p.size.eq(L))));
}
И это работает, но если я теперь хочу использовать BooleanBuilder, чтобы найти по нескольким критериям в этой таблице, например, еще какого-то человека с курткой от Reebock желтого цвета и размером, как это:
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))));
Это вернет мне 0, но на самом деле совпадений два. Но я думаю, что он сейчас ищет по ID, а не по PationID. Так что нет ID 1 со стендовыми совпадениями..
Есть ли способ сделать этот поиск? может с другим подходом?