Projections.property()中的嵌套属性路径

Sai*_*ali 2 java hibernate hibernate-criteria

我有以下代码:

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();
Run Code Online (Sandbox Code Playgroud)

但是Hibernate terminology.definition使用异常org.hibernate.QueryException来阻塞:无法解析属性:terminology.definition:net.* .Term

尽管有一个属性Term:

@OneToOne(mappedBy = "term")
public Terminology getTerminology() { return terminology; }
Run Code Online (Sandbox Code Playgroud)

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

session.createCriteria(Term.class).createAlias("terminology", "terminology")
Run Code Online (Sandbox Code Playgroud)

但这是不可取的.

Mat*_*att 5

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

实际上,如果你看一下JavaDocs的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();
Run Code Online (Sandbox Code Playgroud)

您会注意到您可以使用别名和.符号,也可以使用createCriteria直接的属性名称.

但是,此示例适用于where子句.不是100%如何为预测发挥作用(即,如果您可以使用投影的子标准).我只是坚持你已经拥有的别名方法.