怎么了
session.createCriteria(Composed.class, "main")
.createAlias("main.id.branch", "b1")
.add(Restrictions.eq("b1.owner", user))
.list();
?对应的HQL可以正常工作
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();
根据条件,Hibernate 不创建联接 并使用 where b1x1_.owner_id=?
,但任何地方都没有 b1x1_
,因此失败带有“无法准备声明”。
类(class)很简单
@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
}
更新
最佳答案
我没试过,但也许用左连接创建两个别名对你有帮助。我的意思是:
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))
希望对您有所帮助!
关于java - 带别名的 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104961/