Я пытаюсь переопределить метод saveAll JpaRepository для использования пользовательского запроса UPSERT в java SpringBoot. Возможно ли это?
Есть ли способ переопределить метод JPA saveAll для использования индивидуального запроса UPSERT?
9 августа 2021 в 05:03
263
2
Ответы (2)
18 августа 2021 в 09:22
Я использовал JdbcTemplate (NamedParameterJdbcTemplate)
//Bean
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
JdbcTemplate template = new JdbcTemplate(hikariDataSource);
template.setQueryTimeout(Integer.parseInt(queryTimeout));
return new NamedParameterJdbcTemplate(template);
}
Затем
//Autowire NamedParameterJdbcTemplate
MapSqlParameterSource[] paramsArray =
mapperClass.mapDTOstoSqlParameterSource(items);
namedParameterJdbcTemplate.batchUpdate(SQL_qUERY, paramsArray);
Затем
//Mapper class
public static MapSqlParameterSource[]
mapDTOstoSqlParameterSource(List<ItemDTO> items) {
List<MapSqlParameterSource> params = new ArrayList<>();
for (ItemDTO obj : items) {
MapSqlParameterSource source = new MapSqlParameterSource();
source.addValue("queryPara1", obj.getID());
source.addValue("queryPara2", obj.getSomething());
params.add(source);
}
return params.toArray(MapSqlParameterSource[]::new);
}
9 августа 2021 в 07:34
Поскольку это только один репозиторий, вы можете создать собственный репозиторий, подобный этому. Я предполагаю, что имя сущности — User:
.Ваш интерфейс только с этим методом saveAll
interface CustomizedUserRepository {
void savAllWithUpsert(Iterator<User> entities);
}
Затем необходимо реализовать интерфейс
class CustomizedUserRepositoryImpl implements CustomizedUserRepository {
public void savAllWithUpsert(Iterator<User> entities) {
// Your custom implementation
}
}
Самой важной частью имени класса, соответствующей интерфейсу фрагмента, является постфикс Impl.
И, наконец, используйте, но все вместе:
interface UserRepository extends JpaRepository<User, Long> CustomizedUserRepository {
}
Пожалуйста, прочтите также полную документацию: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behavior
Вы хотите переопределить его для всех репозиториев только для одного?
только один репозиторий.