JPA获取实体对象失败,返回Repository引用如何解决?
问题描述
想要获取包含如下字段的Question实体:
"id":[1], "text":[some text]
以便对字段进行操作,但实际得到的是类似org.springframework.data.jpa.repository.support.SimpleJpaRepository@b1e8d6a的Repository引用。
Question实体代码:
@Getter @Setter @Entity(name = "questionTable") public class Question { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; @Column(name = "text", nullable = false, length = 1000) private String text; }
尝试的Repository代码:
@Repository @Transactional public interface QuestionRepository extends JpaRepository<Question, Long> { @Query(value = "SELECT new io.stepa.StepaDomashniyBot.model.Question(QT.id, QT.text) FROM questionTable as QT WHERE id = 1", nativeQuery = true) Question getFirstQuestion(); }
问题原因
- 原生SQL不支持JPQL构造器语法:开启
nativeQuery = true后,SQL直接针对数据库表执行,无法使用JPQL的new 实体类(...)构造器语法,会导致结果无法正确映射。 - 调用方式错误:若得到Repository引用,说明你可能没有调用
getFirstQuestion()方法,而是直接输出了Repository实例本身。
解决方案
方案1:使用JPQL查询(推荐)
去掉nativeQuery = true,用JPQL直接查询实体,JPA会自动完成结果映射:
@Repository @Transactional public interface QuestionRepository extends JpaRepository<Question, Long> { @Query("SELECT q FROM Question q WHERE q.id = 1") Question getFirstQuestion(); }
或者更简便,直接使用JpaRepository自带的方法,无需自定义查询:
// 在调用处获取实体 Question question = questionRepository.findById(1L).orElse(null);
方案2:使用原生SQL查询
如果必须用原生SQL,直接查询表字段即可(需保证表字段名和实体属性名匹配),JPA会自动映射结果到实体:
@Repository @Transactional public interface QuestionRepository extends JpaRepository<Question, Long> { @Query(value = "SELECT id, text FROM questionTable WHERE id = 1", nativeQuery = true) Question getFirstQuestion(); }
正确调用方式
在业务类中注入Repository后,调用对应方法获取实体,而非直接使用Repository实例:
@Service public class SomeService { @Autowired private QuestionRepository questionRepository; public void operateQuestion() { // 调用方法获取实体对象 Question question = questionRepository.getFirstQuestion(); // 操作实体字段 System.out.println(question.getId() + ": " + question.getText()); } }
内容的提问来源于stack exchange,提问作者Petr Goldberg
相关产品推荐
相关产品推荐

