Spring Data, независимый репозиторий и нативный @Query
Вот простой репозиторий:
interface TablitcaReposytory : CrudRepository<Tablitca, Integer> {
}
Как видите, он привязан к определённому Entity․ Естественно, когда используешь @Query, он использует данную таблицу, а по задаче нужно менять поля, которые не имеют своих Entity, то есть соответствующих классов в коде.
Как быть?
Ответы (1 шт):
При использовании JpaRepository (CrudRepository) наличие @Entity обязательно.
Однако, можно сделать, чтобы один класс-entity отображался не на одну таблицу, а на несколько, используя @SecondaryTable, также пример на SO, соответственно тогда в Repository можно будет написать запросы, модифицирующие данные в связанных таблицах.
Альтернативный вариант (без использования Entity) -- создать самописный класс, пометить его @Repository, внедрить в него экземпляр EntityManager, который следует использовать для выполнения запросов (в т.ч. нативных) и/или при помощи Criteria API:
@Repository
public class TableRepository {
@PersistenceContext
EntityManager entityManager;
@Transactional
public void updateFoo(Foo foo) {
Query query = entityManager.createNativeQuery("UPDATE foo SET bar=:bar WHERE id=:id");
query.setParameter("bar", foo.getBar());
query.setParameter("id" foo.getId());
query.executeUpdate();
}
@Transactional
public void updateBar(Bar bar) {
Query query = entityManager.createNativeQuery("UPDATE bar SET baz=:baz WHERE id=:id");
query.setParameter("baz", bar.getBaz());
query.setParameter("id" bar.getId());
query.executeUpdate();
}
}
Ещё одна альтернатива - использовать JdbcTemplate.