休眠 HQL 到条件

Posted

技术标签:

【中文标题】休眠 HQL 到条件【英文标题】:Hibernate HQL to Criteria 【发布时间】:2012-08-26 15:25:11 【问题描述】:

我正在尝试将一个简单的 HQL 转换为 Criteria API,有人可以帮助我吗? 这是我的 HQL:

SELECT ch FROM Parent p JOIN p.childeren ch WHERE p.id = :id

结果我得到了孩子。重要的是没有从孩子到父母的关系。 Parent 与孩子之间只有这样的关系:

@OneToMany(fetch = FetchType.LAZY, cascade =  CascadeType.ALL )
@JoinColumn(name="parent_id")
私人名单儿童;

如何使用标准 API 获得相同的结果?

【问题讨论】:

没有孩子和父母的关系?请向我们展示您的映射。 原来的问题不在于孩子和父母。我已对其进行了更改,以使我的问题更清楚。 【参考方案1】:

此问题的一个可能解决方案是使用 sqlRestriction,如下例所示,但这并不好,因为它需要使用数据库列名。

Criteria crit = sessionFactory.getCurrentSession().createCriteria(Child.class); crit.add(Restrictions.sqlRestriction("alias.parent_id = ?", parentId, LongType.INSTANCE));

有人有更好的解决方案吗?

【讨论】:

【参考方案2】:

您不需要对此进行查询,因为您可以这样做:

Set<Child> children = session.get(Parent.class, id).getChildren();
children.size(); // trigger lazy initialization

【讨论】:

问题是“如何将 HQL 转换为 Criteria-API?”您的解决方案不是 Criteria API。【参考方案3】:

使用 Criteria API 仅获取关联实体是一件非常痛苦的事情。您需要子查询:

    DetachedCriteria subCriteria = DetachedCriteria.forClass(Parent.class);
    subCriteria.createCriteria("children", "c");
    subCriteria.setProjection(Projections.property("c.id"));
    subCriteria.add(Restrictions.eq("id", 1));
    // Assuming Children is the name of the class
    Criteria criteria = sess.createCriteria(Children.class);
    criteria.add(Subqueries.propertyIn("id", subCriteria));
    criteria.list();

【讨论】:

以上是关于休眠 HQL 到条件的主要内容,如果未能解决你的问题,请参考以下文章

休眠条件:在没有映射关联的情况下加入表

带有条件的休眠调用函数

休眠查询语言或使用条件?

如何使用休眠条件仅返回对象的一个​​元素而不是整个对象?

休眠条件查询到 JPA 条件查询

来自标准查询的休眠 NamedQuery --> 需要帮助