जेपीए की प्रमुख विशेषताओं में से एक अपने जावा कोड से बुनियादी तथ्य डेटाबेस-विवरण (विदेशी चाबियां) दूर सार संक्षेप है।
@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();
}
ध्यान दें कि इस तरह के एक अद्यतन एक ही भीतर पुनः प्राप्त किसी भी संस्था में परिवर्तन नहीं होगा वहाँ क्वेरी आप रूपरेखा कर रहे हैं को प्राप्त करने के कई तरीके हैं, यहाँ एक जोड़े हैं लेन-देन।
final Foo foo = em.find(Foo.class, 1);
updateFlags(Arrays.asList(1), true);
वास्तविक Foo-object को नहीं बदलेगा।
ऐसा करने का मेरा पसंदीदा तरीका कुछ इस तरह होगा:
@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();
}
आप निश्चित रूप से बना सकते हैं एक @Column
कि bar_id
नक्शे, लेकिन मैं इस की सिफारिश नहीं होगा, क्योंकि यह एक तरह से करने के उद्देश्य धरा JPA
।
संग्रह कहां है? –
क्या यह उत्तर नहीं देता है? http://stackoverflow.com/questions/3629259/how-do-i-do-a-jpql-subquery –
@sashok_bg मैंने कोशिश नहीं की है, लेकिन मुझे नहीं लगता कि ऐसा इसलिए होगा क्योंकि मेरे पास नहीं है इकाई में मैप किए गए कच्चे विदेशी कुंजी (उनके उदाहरण में 'p.country_id') – SCdF