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")
プライベート リストの子。

criteria-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

次のことができるため、このためのクエリは必要ありません。

Set<Child> children = session.get(Parent.class, id).getChildren();
children.size(); // trigger lazy initialization
于 2012-08-31T22:39:41.547 に答える
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 に答える