Spring Boot не получает правильные данные из базы данных Oracle - PullRequest
1 голос
/ 09 марта 2020

Мой код выглядит следующим образом:
Репозиторий:

@Repository
@Component
public interface SearchInventoryRepository extends JpaRepository<Inventory, String>{

    @Query(nativeQuery = true, value = "select * from ORACLE_DATA1")
    List<Inventory> findAllDatabases();

    @Query(nativeQuery = true, value = "select count(*) from ORACLE_DATA1")
    int getCount();
}

Сервис:

@Transactional
@Service
public class GetInventoryService {

    @Autowired
    private SearchInventoryRepository searchInventoryRepository;

    public List<Inventory> findAllDatabases()
    {           
        return searchInventoryRepository.findAllDatabases();
    }

    @Autowired
    public int getCount()
    {
        return searchInventoryRepository.getCount();
    }
}

Контроллер:

@RestController
@Component
public class GetInventoryController {

    @Autowired
    private GetInventoryService getInventoryService;

    @CrossOrigin
    @GetMapping("/getAll")
    public List<Inventory> getAll()
    {
        return getInventoryService.findAllDatabases();
    }

    @CrossOrigin
    @GetMapping("/getCount")
    public int getCount()
    {
        return getInventoryService.getCount();
    }
}

Следующие запросы дают правильный результат, когда я запускаю их в SQL developer:

select * from ORACLE_DATA1;
select count(*) from ORACLE_DATA1;

Однако в API Spring многие результаты являются дубликатами, а многие результаты не извлекаются. Количество результатов остается таким же в SQL Developer, как и при получении через API.

Я никогда раньше не сталкивался с такой проблемой. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Я не знаю, почему вы используете собственные запросы, но JpaRepository расширяет PagingAndSortingRepository, а PagingAndSortingRepository расширяет CrudRepository, и это обеспечивает, и я цитирую:

sophisticated CRUD functionality for the entity class that is being managed

Пример:

public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
                                                                                                                   (1)
<S extends T> S save(S entity);
                                                                                                                   (2)
T findOne(ID primaryKey);
                                                                                                                   (3)
Iterable<T> findAll();

Long count();
                                                                                                                   (4)
void delete(T entity);
                                                                                                                   (5)
boolean exists(ID primaryKey);
                                                                                                                   (6)
// … more functionality omitted.

}

Среди существующих методов есть два, которые делают то, что вам нужно. Не стоит изобретать велосипед заново.

Вы можете получить больше информации по этой ссылке https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

0 голосов
/ 09 марта 2020

1) Нет необходимости комментировать с @Repository интерфейсом, который расширяет JpaRepository

2) Неправильно комментировать с @Component классом, который уже имеет @Repository, @Service или @Controller аннотация.

@Component просто помечает класс как компонент, остальные объединяют эту функцию.

3) @Autowired используется для внедрения экземпляров аннотированного типа. Это не правильно:

@Autowired
public int getCount()
{
    return searchInventoryRepository.getCount();
}

4) Вы можете использовать методы по умолчанию, предоставляемые JpaRepository вместо использования @Query. Например:

searchInventoryRepository.findAll(); // already defined

и

searchInventoryRepository.count(); // already defined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...