2012-08-31 179 views
0

我想翻译一个简单的HQL到Criteria API,任何人都可以帮我吗? 这是我的HQL:休眠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; 

我怎样才能获得使用标准的API相同的结果?

+0

从孩子到家长没有关系?请告诉我们你的映射。 –

+0

原始问题不在于孩子和家长。我已经改变了它,使我的问题更清楚。 –

回答

1

只有获取相关的实体是使用标准的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));

是否有人有更好的解决办法?

0

你并不需要为这个查询,因为你可以这样做:

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

问题是“如何将HQL转换为Criteria-API?”您的解决方案不是Criteria API。 –