【问题标题】:Hibernate HQL to Criteria休眠 HQL 到条件
【发布时间】: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 获得相同的结果?

【问题讨论】:

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

标签: hibernate hibernate-criteria


【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2013-12-27
      • 1970-01-01
      • 2017-06-23
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多