2015-12-05 5 views
5

Was mitHibernate-Abfrage mit einem Alias ​​

session.createCriteria(Composed.class, "main") 
.createAlias("main.id.branch", "b1") 
.add(Restrictions.eq("b1.owner", user)) 
.list(); 

falsch? Die entsprechende HQL funktioniert

String hql = "select main from Composed as main" 
     + "left join main.id.branch as b1 where b1.owner = ?"; 
session.createQuery(hql) 
.setInteger(0, user.id().intValue()) 
.list(); 

von den Kriterien, Hibernate keine beitreten erstellt und verwendet where b1x1_.owner_id=?, aber es gibt keine b1x1_ überall, so schlägt es mit „Anweisung nicht vorbereiten konnte“.

Die Klassen sind ziemlich trivial

@Entity class Composed { 
    @Id ComposedId id; // also tried @EmbeddedId 
    ... irrelevant stuff 
} 

@Embeddable class ComposedId { 
    @ManyToOne(optional=false) Branch branch; 
    ... irrelevant stuff 
} 

@Entity class Branch { 
    @Id Integer id; 
    @ManyToOne(optional=false) User owner; 
    ... irrelevant stuff 
} 

@Entity class User { 
    @Id Integer id; 
    ... irrelevant stuff 
} 

aktualisieren

ich endlich eine SSCCE erstellt haben und eine issue abgelegt. Sorry für die verwirrende Frage, ohne die SSCCE, ist es ziemlich schwierig zu reproduzieren.

+0

nicht sicher, aber haben Sie versucht Alias ​​in Schritten erstellen? sag zuerst für main.id = x1 dann x1.branch = x2 und so weiter.? – Forkmohit

+0

@Forkmohit Jetzt habe ich. IMHO gibt es keine Notwendigkeit für Aliasing main.id, wie es eingebettet ist, aber ich habe es versucht. Ich habe auch versucht, den Alias ​​nur für main.id und whatelse zu erstellen. – maaartinus

+0

Könnten Sie versuchen 'Restrictions.eq ("b1.owner.id", user.id(). IntValue())'? Könnten Sie auch die gesamte generierte SQL und Fehlermeldung teilen? –

Antwort

1

ich versuchte nicht, aber vielleicht zwei Aliase mit links zu schaffen join hilft Ihnen. Ich meine das:

session.createCriteria(Composed.class, "main") 
    .createAlias("main.id", "id1", JoinType.LEFT_OUTER_JOIN) 
    .createAlias("id1.branch", "b1", JoinType.LEFT_OUTER_JOIN) 
    .add(Restrictions.eq("b1.owner", user)) 

Hoffe es hilft!

0

Sie benötigen ein Unterkriterium für den Join anstelle eines Alias, da Branch ein zugeordnetes Entity ist.

session.createCriteria(Composed.class, "main") 
    .createCriteria("main.id.branch", "b1") 
    .add(Restrictions.eq("b1.owner", user)) 
    .list(); 
+0

Keine Ahnung, ob das wirklich hilft, und keine Zeit, es jetzt zu versuchen, aber die Prämie wird bald auslaufen. Könnten Sie näher erläutern, warum ich Unterkriterien brauche? – maaartinus

+0

Du hast gesagt, 'Hibernate keine join' erzeugt, die das Ergebnis von Ihnen ist dies nicht zu tun anweist wintern. Wenn Sie ein Unterkriterium erstellen, erzwingen Sie, dass Hibernate einen Join erstellt. Ich habe noch keine Erfahrung mit 'embeddable', aber ich nehme an, dass sie sich genauso verhalten wie' components'. Ich habe es auch nicht getestet, aber aufgeschrieben, wie ich es mache. Hetze nicht nach dem Kopfgeld, wenn es abläuft, tut es. – djmj

+0

Leider funktioniert es auch nicht. Ich schätze, in der Zwischenzeit habe ich alle Möglichkeiten ausprobiert. Ich bedauere, komponierte ID verwendet zu haben, da Hibernate auf dieser Seite gebrochen ist. Ich habe sogar JPA mit hibernate-jpamodelgen ausprobiert, aber es generiert nichts für meine 'ComposedId', also bin ich wieder verloren. Vielleicht liegt es daran, dass ich eine statische geschachtelte Klasse verwende. – maaartinus

Verwandte Themen