Ich habe ein Domain-Objekt, Expense, das ein Feld namens initialFields hat.Hibernate-Kriterien mit Projektion, die keine Abfrage für @OneToMany-Mapping durchführt
Es ist, als so kommentiert:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
nun aus Leistungsgründen bestimmte Felder zu ziehen, um ich versuche nur Projektionen, um zu verwenden, aber wenn dabei ist das initialFields Feld immer null. Es ist das einzige OneToMany-Feld und das einzige Feld, das ich mit der Projektion, die sich so verhält, abrufen möchte. Wenn ich eine reguläre HQL-Abfrage verwende, wird initialFields entsprechend ausgefüllt, aber natürlich kann ich die Felder nicht begrenzen.
Teilprojektionscode:
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");
ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));
return criteria.list();
Wenn ich auf Fehlersuche einschalten und aktivieren Sie SQL anzeigen, die Abfrage die initialFields ziehen nicht angezeigt/run erstellt werden. Hat schon mal jemand so etwas gesehen?
Ich habe gerade versucht, mit HQL-Projektion, indem Sie jedes Feld, das ich ziehen möchte, und dann manuell das Objekt erstellen. In diesem Fall ist das von Hibernate erstellte SQL für das Feld initialFields falsch. expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_
. Die . as col_2_0_ is
, wo die initialFields gezogen würden. Meine Vermutung ist, dass es expense1_.id as col_2_0_
sein sollte.
Edit: Ich habe nur den Result Transformer entfernt, um jede Eigenschaft zu überprüfen, und die Eigenschaft initialFields ist in der Tat null.
Interessant, ich muss das versuchen, wenn ich jemals wieder zu diesem Code komme. Danke – Josh
Ja, cpecify Join Typ ist immer eine gute Idee. –