首页 文章

Hibernate HQL to Criteria

提问于
浏览
0

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

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

结果我得到了孩子 . 重要的是,从孩子到父母没有任何关系 . 父母对这样的孩子只有这样的关系:

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinColumn(name="parent_id")
private List children;

如何使用criteria-api获得相同的结果?

3 回答

  • 0

    只使用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();
    
  • 0

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

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

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

  • 1

    您不需要查询,因为您可以这样做:

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

相关问题