Есть ли способ переопределить метод JPA saveAll для использования индивидуального запроса UPSERT?

avatar
Miraj Hamid
9 августа 2021 в 05:03
263
2
0

Я пытаюсь переопределить метод saveAll JpaRepository для использования пользовательского запроса UPSERT в java SpringBoot. Возможно ли это?

Источник
Simon Martinelli
9 августа 2021 в 05:57
0

Вы хотите переопределить его для всех репозиториев только для одного?

Miraj Hamid
9 августа 2021 в 07:11
0

только один репозиторий.

Ответы (2)

avatar
Miraj Hamid
18 августа 2021 в 09:22
0

Я использовал 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);
}
avatar
Simon Martinelli
9 августа 2021 в 07:34
2

Поскольку это только один репозиторий, вы можете создать собственный репозиторий, подобный этому. Я предполагаю, что имя сущности — 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