Ich arbeite aktuell mit JPA2 (Hibernate Impl. 3.6) und dem Criteria Builder von JPA2. Folgende Problemstellung habe ich:
Für die Filterung biete die Criteria API folgendes an
Dies funktioniert auch soweit.
Für das Fetchen von Objekten bietet die Criteria API folgendes an ;
Dies funktioniert auch soweit. Bei der fetch-Operation kann leider keine where Bedingung erstellt werden.
Jetzt habe ich das Problem, das ich beide Wege irgend wie kombinieren will. Es soll auf die ChildEntities gefiltert werden und die gefilterte Liste soll gleich per fetch dazu gemappt werden. Es soll kein zusätzlichen Datenbankzugriff für die Befüllung der Objekte erfolgen.
probierter Lösungsansatz aus dem Internet
Im Internet wurde vorgeschlagen, sowohl den Join-Operator (für die Filterung) als auch den Fetch-Operator (für das Laden der Objekte) zu verwenden. Dies ist leider inhaltlich nicht ganz richtig, da die ChildEntities zweimal in dem SQL dazu gejoint, aber nur einmal gefiltert werden. Ich bekomme zwar nur RootEntities, welche den Suchkriterien entsprechen, aber zu den RootEntity werden alle zugeordneten ChildEntities erstellt und nicht nur die ChildEntities, welche den Suchkriterien entsprechen.
mit Hibernate @Filter
mit Hibernate Mitteln habe ich das gewünschte Ergebnis hinbekommen. Dazu kann man die Filter von Hibernate verwenden. Diese Lösung gefällt mir nicht wirklich, da ich die typischere Criteria API verlassen muss und nicht mehr implementierungsunabhängig bin.
Hat jemand Ideen, wie das gewünschte Verhalte mit der Criteria API von JPA2 umzusetzen geht?
- Root Entity mit Liste von Child Entities (klassiche 1:n Verbindung)
- suche nach einen Root Entities für einen speziellen Child Entity
- das spezielle Child Entity soll gleich per fetch join gemappt werden
Für die Filterung biete die Criteria API folgendes an
Java:
CriteriaQuery<RootEntity> qry = em.getCriteriaBuilder().createQuery(RootEntity.class);
Root<RootEntity> rootQry = qry.from(RootEntity.class);
Join<RootEntity,ChildEntity> join = rootQry.join(...);
Path<String> path = join.get("column");
Predicate pred = em.getCriteriaBuilder().equal(path, "value");
qry.where(pred);
Für das Fetchen von Objekten bietet die Criteria API folgendes an ;
Java:
CriteriaQuery<RootEntity> qry = em.getCriteriaBuilder().createQuery(RootEntity.class);
Root<RootEntity> rootQry = qry.from(RootEntity.class);
Fetch<RootEntity,ChildEntity> fetch = rootQry.fetch(...);
Jetzt habe ich das Problem, das ich beide Wege irgend wie kombinieren will. Es soll auf die ChildEntities gefiltert werden und die gefilterte Liste soll gleich per fetch dazu gemappt werden. Es soll kein zusätzlichen Datenbankzugriff für die Befüllung der Objekte erfolgen.
probierter Lösungsansatz aus dem Internet
Im Internet wurde vorgeschlagen, sowohl den Join-Operator (für die Filterung) als auch den Fetch-Operator (für das Laden der Objekte) zu verwenden. Dies ist leider inhaltlich nicht ganz richtig, da die ChildEntities zweimal in dem SQL dazu gejoint, aber nur einmal gefiltert werden. Ich bekomme zwar nur RootEntities, welche den Suchkriterien entsprechen, aber zu den RootEntity werden alle zugeordneten ChildEntities erstellt und nicht nur die ChildEntities, welche den Suchkriterien entsprechen.
mit Hibernate @Filter
mit Hibernate Mitteln habe ich das gewünschte Ergebnis hinbekommen. Dazu kann man die Filter von Hibernate verwenden. Diese Lösung gefällt mir nicht wirklich, da ich die typischere Criteria API verlassen muss und nicht mehr implementierungsunabhängig bin.
Hat jemand Ideen, wie das gewünschte Verhalte mit der Criteria API von JPA2 umzusetzen geht?