konto usunięte

Temat: [JPA 2] JOIN z warunkami w Criteria API

Witam,

Czy ktoś wie jak skonstruować JOIN-a z restrykcjami w criteraia API w JPA 2 ? Załóżmy, że mam tabele:

A (atrybuty: id) i tabelę B (atrybuty: id, name, a_id)

i encje:

A (atrybuty: id, list_of_b ), B (atrybuty: id, name, a)

Zapisy poglądowe oczywiście :)

Chciałbym teraz otrzymać rezultat zgodny z rezultatem tego zapytania JPQL:

SELECT a, b
FROM A a
LEFT OUTER JOIN a.list_of_b b WITH b.name = 'wymyslona_nazwa'

Zaciąłęm się na JOINie warunkowycm (b.name = 'wymyslona_nazwa') w Criteria API - ktoś ma pomysł jak to ugryźć ?

pozdrawiam,

PS. Dla jasności: przeniesienie warunkowej części złączenia do klauzuli WHERE nie działa tak samo (zarówno w SQL czy JPQL).Pawel Dolega edytował(a) ten post dnia 14.07.11 o godzinie 17:52
Tomasz D

Tomasz D Programista
Java/JEE, freelancer

Temat: [JPA 2] JOIN z warunkami w Criteria API

Nie jestem pewny czy na pewno Ci o to chodzi, ale wrzucam zarys jak robiłem coś podobnego w jakimś projekcie:



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

Join<RootObject, JoinedTypeObject> types = entity.join("type", JoinType.LEFT);

predicates.add(types.in(wrapper.getSelectedTypes())

// i potem wrzucasz predykaty do query



chociaż po chwili zastanowienia może własnie to miałeś na myśli pisząc PS :)

Ale zaryzykuję ;)

konto usunięte

Temat: [JPA 2] JOIN z warunkami w Criteria API

Ok, żebym sobie to w głowie ułożył: gdzie później wrzucam te predykaty ?
Tomasz D

Tomasz D Programista
Java/JEE, freelancer

Temat: [JPA 2] JOIN z warunkami w Criteria API

Ok, mam to w kilku metodach, ale może uda mi się to jakoś streścić:


CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Poi> findPoiQuery = cb.createQuery(Poi.class);
Root<Poi> poiEntity = findPoiQuery.from(Poi.class);
findPoiQuery.select(poiEntity);

findPoiQuery.select(count);

// predykaty z joinem
List<Predicate> predicates = new ArrayList<Predicate>();
Join<Poi, Type> types = entity.join("type", JoinType.LEFT);
predicates.add(types.in(wrapper.getSelectedTypes()));

findPoiQuery.where(cb.and(cb.or(predicates.toArray(new Predicate[0])),anotherDummyPredicate ));

TypedQuery<?> resultQuery = entityManager.createQuery(findPoiQuery);

List<Poi> list = resultQuery.getResultList();

konto usunięte

Temat: [JPA 2] JOIN z warunkami w Criteria API

Tomasz Dziurko:
Ok, mam to w kilku metodach, ale może uda mi się to jakoś streścić:


....

findPoiQuery.where(cb.and(cb.or(predicates.toArray(new Predicate[0])),anotherDummyPredicate ));

....

Niestety to jest właśnie to (predykat w WHERE) co zawala mi całą sprawę.
Dla jasności pokaże przykład:

Mamy takie dane:
A id = 1
B id = 1, name = 'Paweł'

i teraz dwie opcje query:
1)
SELECT a, b
FROM A a
LEFT OUTER JOIN a.list_of_b b WITH b.name = 'Tomasz'

zwraca:
a (o id = 1), null (jako b)

2)
SELECT a, b
FROM A a
LEFT OUTER JOIN a.list_of_b b
WHERE b.name = 'Tomasz' OR b.name IS NULL

zwraca:
zbiór pusty (0 krotek).

Następna dyskusja:

Flickr's Api




Wyślij zaproszenie do