What's wrong with
session.createCriteria(Composed.class, "main")
.createAlias("main.id.branch", "b1")
.add(Restrictions.eq("b1.owner", user))
.list();
? The corresponding HQL works fine
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();
From the Criteria, Hibernate creates no join and uses where b1x1_.owner_id=?
, but there's no b1x1_
anywhere, so it fails with "could not prepare statement".
The classes are rather 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
}
I've finally created an SSCCE and filed an issue. Sorry for the confusing question, without the SSCCE, it's rather hard to reproduce.
I didn't try but maybe creating two aliases with left join helps you. I mean this:
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))
Hope it helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With