You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot微服务连接PostgreSQL数据无法显示问题求助

排查Spring Boot+PostgreSQL接口返回空数据的问题

咱们一步步拆解为啥Hibernate明明执行了查询,却返回空结果,把问题解决掉:

1. 先确认数据库里有没有数据

这是最基础但最容易忽略的点:直接在PostgreSQL客户端(比如psql、pgAdmin)执行Hibernate打印的查询语句:

select itemsmodel0_.item_id as item_id1_0_, itemsmodel0_.name_id as name_id2_0_ from public.t_item itemsmodel0_

如果这条SQL返回空,那问题就很简单——你的t_item表本来就没有数据。先插几条测试数据试试:

INSERT INTO public.t_item (item_id, name_id) VALUES (1, 'test_item_1'), (2, 'test_item_2');

插完再调用/item/all接口,应该就能看到结果了。

2. 修正实体类与数据库的映射问题

如果数据库里有数据但查不到,大概率是实体类和数据库表/字段的映射不匹配:

(1)表名大小写不匹配

PostgreSQL有个规则:如果创建表时没加双引号,系统会自动把表名转成小写。你的实体类写的是@Table(name = "T_Item"),但Hibernate查询语句里是public.t_item,说明数据库里的表实际是t_item(小写)。

解决办法:把实体类的@Table注解改成小写表名:

@Table(name = "t_item")

要是你一定要用驼峰表名,就得在创建表时加双引号:

CREATE TABLE "T_Item" (
    item_id SERIAL PRIMARY KEY,
    name_id VARCHAR(255)
);

(2)字段名映射不匹配

看你的实体类代码:

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

但Hibernate的查询语句里用的是itemsmodel0_.name_id,说明数据库里的字段是name_id(下划线命名),而你注解里指定的是nameId,这就导致了映射错位(虽然Hibernate默认会把驼峰转成下划线,但你手动指定了@Column(name = "nameId"),反而会让Hibernate去查找不存在的nameId字段)。

修正方法:把@Column的name改成数据库实际的字段名:

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

(3)规范实体类字段的封装性

你的itemId字段是public修饰的,虽然Hibernate能识别,但不符合Java封装规范,建议改成private,依赖已有的getter/setter:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long itemId; // 从public改为private

3. 验证主键生成策略(可选)

如果是手动插入的数据,不用纠结主键是否和Hibernate的序列一致——只要数据库里有数据,findAll()就应该能查到。不过如果是自动建表,GenerationType.AUTO在PostgreSQL下会用hibernate_sequence序列自增,要是你手动插入的item_id在序列当前值之后,后续自动插入可能会有冲突,但这不会影响现有数据的查询。

最后再测试

做完上面的调整后,重启Spring Boot应用,再调用/item/all接口,应该就能正常返回数据了。

内容的提问来源于stack exchange,提问作者Stefani Toto

火山引擎 最新活动