一つをJavaコードから(外部キーのような)核心ザラザラデータベースの詳細を抽象化されています
だから、あなたのJPQLクエリは次のようになります。バルクで
@Transactional
public void updateBarFlagForFoo(final int fooId, final boolean newFlagValue) {
final Foo foo = em.find(Foo.class, fooId);
foo.getBar().setFlag(newFlagValue);
}
または、::このような更新は、同じ以内に取得した任意のエンティティを変更しないことを
@Transactional
public void updateFlags(final List<Integer> fooIds, final boolean newFlagValue) {
final Query query = em.createQuery(
"update Bar b set flag = :newFlagValue where b.id in " +
"(select f.bar.id from Foo f where f.id in (:fooIds))");
query.setParameter("newFlagValue", newFlagValue);
query.setParameter("fooIds", fooIds);
query.executeUpdate();
}
注意あなたが概説されているクエリを達成するための複数の方法がありますが、ここではカップルですトランザクション。 Doing
final Foo foo = em.find(Foo.class, 1);
updateFlags(Arrays.asList(1), true);
実際のFooオブジェクトは変更されません。あなたはもちろんbar_id
をマップ@Column
を作成することもできますが、それは一種のの目的に反して、私は、このことをお勧めしません
@Transactional
public void updateFlags(final List<Integer> fooIds, final boolean newFlagValue) {
final List<Bar> bars = findBarsForFooIds(fooIds);
for (final Bar bar : bars) {
bar.setFlag(newFlagValue);
}
}
private List<Bar> findBarsForFooIds(final List<Integer> fooIds) {
final TypedQuery<Bar> q =
em.createQuery("select distinct b from Foo f join f.bar b where f.id in (:fooIds)",
Bar.class);
q.setParameter("fooIds", fooIds);
return q.getResultList();
}
:これを行うの
私の好ましい方法は、このようなものになるだろうJPA
。
コレクションはどこですか? –
これはこれに対応していませんか? http://stackoverflow.com/questions/3629259/how-do-i-do-a-jpql-subquery –
@sashok_bg私はそれを試していないが、私はそれがないと思うエンティティにマッピングされた生の外部キー(例では 'p.country_id') – SCdF