Репозиторий JPA: javax.persistence.NonUniqueResultException: результат возвращает более одного элемента

Используя приведенный ниже код, я не могу получить результаты своего запроса. Использую ли я Map<ContentType... или Map<String..., я получаю ту же ошибку: javax.persistence.NonUniqueResultException: результат возвращает более одного элемента

Похоже, что JPA должен иметь возможность обрабатывать несколько строк в репозиториях. Я искал другие аннотации, которые я мог просто пропустить, и мне трудно найти результаты.

Любые предложения о том, что я должен сделать, чтобы решить эту проблему?

@Transactional
public interface ContentRepository extends JpaRepository<Content,Integer>{

    ....

    @Query(nativeQuery=true, value="SELECT content_type, COUNT(*) AS myColumn FROM dbo.content GROUP BY content_type")
    Map<ContentType, Integer> getContentCountByType();

}

person Webnet    schedule 04.09.2012    source источник
comment
Для начала, это не просто JPA, это похоже на Spring Data JPA.   -  person madth3    schedule 05.09.2012


Ответы (2)


Похоже, проблема заключалась в том, что Map<ContentType, Integer> не имеет обещания уникального индекса, поэтому JPA не любит сопоставление с ним. Если вместо этого использовать List<Map<ContentType, Integer>>, все работает отлично!

person Webnet    schedule 05.09.2012

Попробуйте, это работает

сохранить свою модель в списке

@RequestMapping(value="/deleteDriver/{id}" , method=RequestMethod.POST)
public ResponseEntity<Object> deleteDriver(@PathVariable("id") Integer id)
{
    List<Driver> delete_driver=adminService.getDriverById(id);
    Map<String,Object> response=new HashMap<>();


    if(delete_driver==null)
    {
        response.put("status", "Failure");
        return new ResponseEntity<Object>(response,HttpStatus.NO_CONTENT);
    }
    else
    {
        response.put("status", "Success");
        adminService.delete(delete_driver);
        return new ResponseEntity<Object>(response,HttpStatus.OK);
    }

}

затем в вашем репозитории

@Override
public void delete(List<Driver> delete_driver) {

    driverRepository.delete(delete_driver);
}
person Mohammad Adil    schedule 25.09.2017
comment
Это почти 100% ответ только для кода. Это, как правило, увеличивает неправильное понимание того, что StackOverflow — это бесплатный сервис для написания кода. Было бы лучше, если бы вы дополнили его пояснением того, как и почему ваше предложение помогает решить проблему. - person Yunnosch; 21.02.2019