JPA 2 Criteria

S

Sym

Gast
Hallo,

ich habe ein Problem, welches ich nicht verstehe. Ich habe eine Entität:

Java:
@Entity
public class ProductEntity extends AbstractBaseEntity {
    ...
    @ManyToOne
    private UserEntity owner;
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    private ProductEntity parent;

}

Ich möchte nun eine Criteria bauen, die mit alle Subprodukte zu einem Parent sucht.

Dazu habe ich folgendes

Java:
final CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
final CriteriaQuery<ProductEntity> query = builder.createQuery(ProductEntity.class);
final Root<ProductEntity> root = query.from(ProductEntity.class);

final Predicate condition = builder.equal(root.get(ProductEntity.parent), parent);

query.select(root).where(condition);

final TypedQuery<ProductEntity> q = this.entityManager.createQuery(query);
return q.getResultList();

Damit bekomme ich immer eine leere Liste.

Wenn ich aber die Condition durch

Java:
final Predicate condition = builder.equal(root.get(ProductEntity.owner), parent.getOwner());

ersetze bekomme ich die Produkte für die Owner. Muss ich da etwas besonderes beachten, weil ich mich auf der gleichen Entität bewege? Oder wo ist mein Denkfehler?
 

jwiesmann

Bekanntes Mitglied
Da dein Typ
Code:
FetchType.LAZY
ist, musst du explizit angeben, dass die Tabellen gejoint / gefetched werden müssen.
Hab mal sowas ähnliches gemacht, vielleicht hilft der folgender Code weiter

Java:
fetch = root.fetch(table, JoinType.LEFT);

Du könntest natürlich auch
Code:
FetchType.LAZY
durch
Code:
FetchType.EAGER
ersetzen, würde aber sehr wahrscheinlich die performance stark beeinträchtigen :)
 
S

SlaterB

Gast
was ich nicht ganz verstehe, wahrscheinlich weit davon entfernt helfen zu können:
wenn parent eine privates Instanzattribut in ProductEntity ist, wie kann dann

Java:
final Predicate condition = builder.equal(root.get(ProductEntity.parent), parent);
als Java-Code überhaupt kompilieren? ist ProductEntity hier gar eine großgeschriebene Variable?
 
S

Sym

Gast
Da dein Typ
Code:
FetchType.LAZY
ist, musst du explizit angeben, dass die Tabellen gejoint / gefetched werden müssen.
Hab mal sowas ähnliches gemacht, vielleicht hilft der folgender Code weiter

Java:
fetch = root.fetch(table, JoinType.LEFT);

Du könntest natürlich auch
Code:
FetchType.LAZY
durch
Code:
FetchType.EAGER
ersetzen, würde aber sehr wahrscheinlich die performance stark beeinträchtigen :)
Danke, das prüfe ich mal genauer.

was ich nicht ganz verstehe, wahrscheinlich weit davon entfernt helfen zu können:
wenn parent eine privates Instanzattribut in ProductEntity ist, wie kann dann

Java:
final Predicate condition = builder.equal(root.get(ProductEntity.parent), parent);
als Java-Code überhaupt kompilieren? ist ProductEntity hier gar eine großgeschriebene Variable?
Es sollte auch ProductEntity_.parent heißen. Ich lasse dies generieren. :)
 

Ähnliche Java Themen

Neue Themen


Oben