3

hqlでコンストラクターを打撃として使用している場合:

String jpql = "select top 10 new Result(a,b) from A a,B b where a.id=b.id" Query query = entityManager.createQuery(jpql);

コンソールは 20 個の SQL ステートメントを出力します。私が予想したように 1 つではありません。しかし、コンストラクターにテーブル A と B のフィールドしか含まれていない場合、SQL は 1 つだけ実行されます。どうしてこうなったんだろう、助けてくれてありがとう!

明確でなくて申し訳ありませんが、ここにいくつかの詳細があります:

List list = baseDao.findListByQL("select new List(a,b) from A a,B b where a.id=b.id");

メソッド「findListByQL」は、「Query query = entityManager.createQuery(jpql);」を使用してメソッドを呼び出しました。何らかの結果を得るために。

そして休止状態は次のようにいくつかのSQLを出力します:

Hibernate: select a0_.id as col_0_0_, b1_.id as col_1_0_ from dbo.A a0_, dbo.B b1_ where a0_.id=b1_.id
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?
Hibernate: select a0_.id as id103_0_, a0_.name as name103_0_ from dbo.A a0_ where a0_.id=?
Hibernate: select b0_.id as id106_0_, b0_.score as score106_0_ from dbo.B b0_ where b0_.id=?

しかし、「new List」コンストラクターが「new List(a.name,b.score)」のようないくつかのフィールド属性を使用する場合、1 つの sql のみを出力します。

4

1 に答える 1

0

次のような HQL を実行する場合:

select new List(a,b) from A a,B b where a.id=b.i

エンティティ A と B 全体を返しています。これらのエンティティのコードが表示されていなくても、おそらくやのようにEAGER 関係がマッピングされている可能性があります。@ManyToOne@OneToOne

EAGER 関係では、この関係を持つエンティティーにヒットするたびに、エンティティーが関連付けられます。これは、この複数の SQL を説明できます。

しかし、次のような HQL を実行すると:

select new List(a.name,b.score) from A a,B b where a.id=b.i

一部のフィールドのみを返しています。この場合、エンティティ クラスを操作していないため、EAGER 関係は「無視」されます。

エンティティ クラス A と B に関する詳細を提供していただければ、エンティティでのこの動作とこれを変更する方法について正確な説明を指定できます。

于 2015-08-19T10:19:30.980 に答える