休眠 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 到条件的主要内容,如果未能解决你的问题,请参考以下文章