0

Hibernateを使用して基準を作成するとします。

Session session = (Session) entityManager.getDelegate();
Criteria rootCriteria = session.createCriteria(entityClass);

エイリアスを明示的に設定しない場合、Hibernateは"this"エイリアスとして使用します(チェックアウトすると、CriteriaImplクラスにハードコードされます。

これの下位基準を作成する場合:

Criteria subCriteria = rootCriteria.createCriteria(associationPath, CriteriaSpecification.LEFT_JOIN);

Hibernateはの内部クラスであるSubcriteriaのインスタンスを作成CriteriaImplし、プロセスでそれにエイリアスを割り当てません。

ただし、クエリを実行してSQLログを確認すると、クエリを実行した場合にのみ、Hibernateがそのエイリアスを作成したことがわかります。これを使用してクエリに制限を追加したいのでSubcriteria、エイリアスを生成しておくと便利です。Hibernateにそのエイリアスを生成させる方法はありますか、それともファクトリメソッドに渡す必要がありますか?

4

1 に答える 1

2

通常、createCriteriaは、エイリアスを使用せずに制限を連鎖させるときに使用されます

Criteria crit = session.createCriteria(Order.class)
    .createCriteria("Items")
        .add(Restrictions.gt("count", 1))
        .add(Restrictions.gt("price", 10))
    .list();

生成されます

SELECT * FROM orders o join items i ON ... WHERE i.count > 1 and i.price > 10

エイリアスを使用すると、次のようになります

Criteria crit = session.createCriteria(Order.class)
    .createAlias("Items", "item")
    .add(Restrictions.gt("item.count", 1))
    .add(Restrictions.gt("item.price", 10))
    .list();
于 2012-08-30T19:14:03.610 に答える