我有以下代码:
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
有一个名为@Basic
的{{1}}属性。我可以用一个看起来很愚蠢的别名修复它:
definition
但这是不可取的。
答案 0 :(得分:5)
由于选择的方式,这是非常标准的 术语主要通过SQL端的连接引入,但就查询而言,您必须定义别名才能访问连接表。
事实上,如果你看一下Criteria
类的JavaDocs,就会有一个例子:
您可以使用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%如何为预测发挥作用(即,如果您可以使用投影的子标准)。我只是坚持你已经拥有的别名方法。