Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据

Posted

技术标签:

【中文标题】Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据【英文标题】:Spring JPA findAll returns empty after changing spring.datasource.url, even though native query with SELECT * returns data 【发布时间】:2022-01-05 21:09:39 【问题描述】:

我已经配置了我的实体、存储库等,并针对我的本地数据库进行了测试。它按预期工作,

但是,在将我的数据源更改为 Amazon RDS 中的生产数据库(它是一个 mysql 数据库)之后,我的 JPA findAll 返回一个空数组,并且 findById 找不到 ID,即使它们确实在数据库中也是如此。

我使用执行 SELECT * 的本机查询进行了测试,它返回了预期的结果。

所以问题是:在使用这个新数据源时,什么可能导致 JPA 语法(如 findAll)出现问题?

package com.example.scoopbe.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "CATEGORY")
public class Category 
    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "name")
    private String name;

    public String getId() 
        return id;
    

    public Category setId(String id) 
        this.id = id;
        return this;
    

    public String getName() 
        return name;
    

    public Category setName(String name) 
        this.name = name;
        return this;
    


package com.example.scoopbe.repository;

import com.example.scoopbe.model.Category;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CategoryRepository extends JpaRepository<Category, String> 



server.port=5000

spring.jpa.hibernate.ddl-auto = update
spring.datasource.url=$DB_URL
spring.datasource.username=$DB_USER
spring.datasource.password=$DB_PASSWORD
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.jpa.show-sql = true

同样,只需更改 DB_URL、DB_USER 和 DB_PASSWORD 就会导致此问题。恢复这些值可以解决问题。

【问题讨论】:

将属性指向Amazon db时,启动Spring应用时是否有错误? @TylerLiu - 春季开始没有问题。我已连接到数据库,只要我使用本机查询就可以查询它。 findAll 和 findById 不返回结果 【参考方案1】:

问题在于,即使表和实体被命名为“CATEGORY”,JPA 使用小写的表名,并且由于它不存在,它会创建一个名为“category”的新表名。

这个新表是空的,这就是我的查询返回空的原因。本机查询命中了正确的表“CATEGORY”

【讨论】:

您好,请记住以下几点提示: 关于答案:- 尝试使用文档来证明您的答案,特别是像您的案例一样,这可以在未来帮助其他人。 - 在终端中发布解决问题的代码和/或步骤。 - 在发布问题和答案之前花一些时间尝试和学习,如果您能够回答自己的问题,那么您可能不应该发布它(我自己已经做过很多次了)。最好的问候。

以上是关于Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA Repository findAll 在 JUnit 测试中不返回任何数据

Spring Data:JPA 存储库 findAll() 返回 *Map 而不是 List?

Spring JPA/Hibernate Repository findAll 在 Kotlin 中默认执行 N+1 个请求而不是 JOIN

Spring jpa jpql查询

Spring Data JPA 和 NamedEntityGraphs

我如何在 Spring Boot 中更改 Repository.findAll() 生成的 json 数组的格式