2

我有以下代码:

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();

但是 Hibernateterminology.definition出现异常 org.hibernate.QueryException: could not resolve property: terminology.definition of: net。* .术语

尽管事实上有一个财产Term

@OneToOne(mappedBy = "term")
public Terminology getTerminology() { return terminology; }

Terminology有一个@Basic名为definition. 我可以用一个看起来很愚蠢的别名来修复它:

session.createCriteria(Term.class).createAlias("terminology", "terminology")

但这是不可取的。

4

1 回答 1

5

由于选择的方式,这是非常标准的。
术语大多类似于通过 SQL 端的连接引入,但就查询而言,您必须定义别名才能访问连接表。

实际上,如果您查看 JavaDocs for Criteriaclass,甚至还有一个示例:

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% 的预测结果如何(即,如果您可以有预测的子标准)。我会坚持使用您已经拥有的别名方法。

于 2012-05-29T15:33:53.790 回答