2011-01-11 9 views
4

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.

Antwort

3

Ich hatte ähnliches Problem und für mich arbeitete explizit unter Angabe joinType in Kriterien.

Criteria criteria = session.createCriteria(Payment.class); 
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN); 
+0

Interessant, ich muss das versuchen, wenn ich jemals wieder zu diesem Code komme. Danke – Josh

+0

Ja, cpecify Join Typ ist immer eine gute Idee. –