【问题标题】:Nested property path in Projections.property()Projections.property() 中的嵌套属性路径
【发布时间】:2012-06-03 19:56:34
【问题描述】:

我有以下代码:

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")

但这是不可取的。

【问题讨论】:

  • 您需要看起来很愚蠢的别名,因为 hibernate 使用它来加入您的表格。 Projections 就像查询的 select 子句,因此您只需在代码中说将术语属性投影到您的实体 Term 中作为属性

标签: java hibernate hibernate-criteria


【解决方案1】:

由于选择的方式,这是非常标准的。
术语主要是通过 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% 的预测结果如何(即,如果你可以有预测的子标准)。我会坚持使用您已有的别名方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2021-12-05
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多