0

我正在尝试将一个简单的 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 获得相同的结果?

4

3 回答 3

1

使用 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();
于 2012-09-01T03:00:56.647 回答
0

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

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

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

于 2012-08-31T22:17:02.807 回答
0

您不需要对此进行查询,因为您可以执行以下操作:

Set<Child> children = session.get(Parent.class, id).getChildren();
children.size(); // trigger lazy initialization
于 2012-08-31T22:39:41.547 回答