You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot与JPA中findById()查询结果无法正常打印问题排查

问题排查与解决方案

从你的描述来看,代码编译运行没报错,但就是打不出Person对象的具体信息,大概率是这几个原因导致的,咱们逐个排查解决:

1. 日志方法的参数用错了

你现在写的日志代码是:

logger.info("User id is ",personJpaRepository.findById(2));

logger.info()的重载规则里,当传两个参数时,第一个是带占位符{}的格式化模板,第二个才是要填充的变量。你现在没加占位符,日志框架只会输出第一个字符串,直接忽略了后面的Person对象参数。

改法很简单:把日志语句改成带占位符的形式:

logger.info("User id is {}", personJpaRepository.findById(2));

2. Person实体类没重写toString()方法

就算日志参数传对了,如果你的Person类没重写toString(),默认会调用Object类的toString(),打印出来的是类似com.yourpackage.Person@7f31245这种哈希码,根本看不到具体的属性值。

解决办法:在Person类里加上toString()重写,比如:

@Entity
public class Person {
    @Id
    private Long id;
    private String name;
    private Integer age;

    // 构造器、getter、setter这里省略

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3. 自定义findById的实现逻辑有问题

虽然你说数据库里有对应id的数据,但如果你的PersonJpaRepository用EntityManager实现findById时踩了坑,比如误用了getReference()而不是find(),也会导致打印异常。

比如检查你的Repository实现:

@Repository
public class PersonJpaRepository {
    @PersistenceContext
    private EntityManager entityManager;

    public Person findById(Long id) {
        // 正确写法:find()会立即查询数据库返回真实实体
        return entityManager.find(Person.class, id);
        // 错误示例:getReference()返回的是代理对象,没触发懒加载时打印会出问题
        // return entityManager.getReference(Person.class, id);
    }
}

getReference()返回的是代理对象,只有当你访问它的属性时才会触发数据库查询,如果直接打印代理对象,可能因为还没加载真实数据,导致toString()拿不到属性值,换成find()就没问题了。

验证步骤

  1. 先改日志语句,加上{}占位符;
  2. 确认Person类重写了toString();
  3. 检查EntityManager的findById是不是用了find()方法;
  4. 重新运行项目,看看日志是不是能正常打印Person的具体信息了。

内容的提问来源于stack exchange,提问作者ashwin karki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:34:57