我有以下代码:
Session session = (Session) em.getDelegate();
Criteria c = session.createCriteria(Term.class);
c.setProjection(
Projections.projectionList()
.add(Projections.property("id"))
.add(Projections.property("qualifier"))
.add(Projections.property("preferred"))
.add(Projections.property("terminology.definition"))
);
c.list();但是Hibernate在terminology.definition上阻塞,只有一个例外: org.hibernate.QueryException:未能解析属性: terminology.definition of: net.*.Term
尽管Term中有一个属性
@OneToOne(mappedBy = "term")
public Terminology getTerminology() { return terminology; }Terminology有一个名为definition的@Basic属性。我可以用一个看起来很蠢的化名来修复它:
session.createCriteria(Term.class).createAlias("terminology", "terminology")但这是不可取的。
发布于 2012-05-29 15:33:53
这是相当标准的,因为选择的方式正在进行。
术语主要是通过SQL端的join引入的,但在查询方面,您必须定义别名才能访问join表。
实际上,如果您查看JavaDocs for Criteria类,甚至有一个例子:
您可以使用createAlias()或createCriteria()导航关联。
List cats = session.createCriteria(Cat.class)
.createCriteria("kittens")
.add( Restrictions.like("name", "Iz%") )
.list();
List cats = session.createCriteria(Cat.class)
.createAlias("kittens", "kit")
.add( Restrictions.like("kit.name", "Iz%") )
.list();您会注意到,您可以使用别名和.表示法,也可以使用带有直接属性名的createCriteria。
但是,这个示例用于where子句。而不是100%的预测结果(也就是说,如果你有预测的次级标准)。我只想坚持你已经用过的化名方法。
https://stackoverflow.com/questions/10801762
复制相似问题