Spring Data JPA 原生查询结果实体
Posted
技术标签:
【中文标题】Spring Data JPA 原生查询结果实体【英文标题】:Spring Data JPA native query result entity 【发布时间】:2021-02-13 06:15:40 【问题描述】:我的本机连接查询生成一个新结果,它是数据库表的组合,因此我为该结果对象创建了一个 dto(将是屏幕上的记录列表)。
我认为我需要将其设为实体,以便 JPA 能够识别它,这是最好的方法吗?
此外,实体需要一个 id,我希望让 jpa 自动生成它,但我收到“无效参数:未知列名 id。ERRORCODE=-4460,SQLSTATE=null”
我的结果集包含 4 条相同的记录而不是 4 条不同的记录,我认为这与我的 id 字段设置不正确有关
任何关于此主题的帮助将不胜感激,谢谢。
`public interface ErrorCodeRepo extends JpaRepository
@Query("SELECT e.transDate, e.category FROM Errors e")
List<QueuedErrors> findQueuedErrors();
`
DTO 类: ` 公共类 QueuedErrors
private String transDate;
private String category;
public QueuedErrors(String transDate, String category)
this.transDate = transDate;
this.category = category;
public String getTransDate()
return transDate;
public void setTransDate(String transDate)
this.transDate = transDate;
public String getCategory()
return category;
public void setCategory(String category)
this.category = category;
`
【问题讨论】:
【参考方案1】:当您创建包含来自多个表(连接后)的结果的导航查询时,您不必创建新实体。
解决此问题的更好方法是使用接口或类 DTO 进行投影。 例如,如果你想合并来自 Person 和 Address Entities 的结果,只需创建接口:
public interface PersonView
String getFirstName();
String getLastName();
String getStreet();
您可以看到来自个人(名字、姓氏)和地址(街道)的组合文件。 您必须将其用作查询响应,如下所示:
@Query(...)
List<PersonView> getPersonWithStreet(String state);
您可以在此处阅读更多信息:
https://www.baeldung.com/spring-data-jpa-projections https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
【讨论】:
好的,我用 repo 中的接口做了一次,但我不喜欢我的结果成为 repo 的一部分......所以我想用类 DTO 进行投影.我已经创建了一个 dto 类,但是我缺少如何将它与 repo 联系起来,我得到了 ConverterNotFoundException 能否提供dto类和仓库代码?而且您不必在存储库接口内创建带有响应的接口。 我在上面添加了 DTO 和 repo...我尝试返回 Object[][] 然后循环遍历它,这可行,但希望以更简单的方式进行,谢谢。跨度> 我已经简化了查询以测试一些东西,当我在查询中使用构造函数表达式时,我能够填充 DTO,但是没有构造函数表达式,我相信我需要匹配实体类的参数。 对 3 个表使用我的本机查询可能会更困难,它甚至会知道我的实体吗?我什至没有为其中一个表创建实体...我将首先尝试一个具有实体的表,看看我是否可以匹配参数,以及当我将其设为本机查询时会发生什么。以上是关于Spring Data JPA 原生查询结果实体的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data JPA:查询如何返回非实体对象或对象列表?
java web spring jpa 在以接口为dao的方法里使用原生sql,联合查找没有对应实体,用啥来接收? 求大神