【问题标题】:Spring Boot not fetching correct data from Oracle databaseSpring Boot 没有从 Oracle 数据库中获取正确的数据
【发布时间】:2020-06-21 08:54:57
【问题描述】:

我的代码如下:
存储库:

@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;

但是在spring api中,很多结果都是重复的,很多结果都没有取到。结果计数在 SQL Developer 中以及通过 API 获取时保持不变。

我以前从未遇到过这样的问题。有人可以帮忙吗?

【问题讨论】:

  • 使用本机查询是否有特定原因?这些查询很简单,你应该可以使用spring-data提供的默认方法count()和findAll()
  • 另外,为什么你在两个不同的类中声明了相同的方法名?您可以直接调用父存储库原生查询。或者保留不同的名字,然后试着打电话看看会发生什么。
  • 放弃你的findAllDatabases 方法并使用findAll 和JpaRepository 一样。这同样适用于您的计数,已经定义了一个 count() 方法。

标签: java oracle spring-boot spring-data-jpa


【解决方案1】:

1) 扩展JpaRepository的接口不需要用@Repository注解

2) 用@Component 注释一个已经有@Repository、@Service 或@Controller 注释的类是不正确的。

@Component 只是将这个类标记为一个 bean,其他的都集成了这个特性。

3) @Autowired 用于注入注解类型的实例。这是不正确的:

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

4) 您可以使用JpaRepository 提供的默认方法,而不是使用@Query。例如:

searchInventoryRepository.findAll(); // already defined

和

searchInventoryRepository.count(); // already defined

【讨论】:

  • 遵循了您的所有观点,但我仍然遇到同样的问题。获取单行的多个条目,甚至没有获取许多行。还有什么建议吗?
  • @shasha0607 这些开箱即用的方法应该适用于您的用例。在不了解全部细节的情况下很难推测可能的原因。您是否可以在 Github 中创建一个示例 repo 来重现该问题?
  • @shasha0607 你确定 "duplicate results" 真的是重复的吗?也许您的数据库中有两次它们。如果您按照我上面所说的方式修改了代码,则代码没有任何问题。
  • 我检查了我的数据库,表中的所有条目都是唯一的。
【解决方案2】:

我不知道你为什么使用本机查询,但是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2017-09-09
    • 2017-01-02
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多