【问题标题】:Spring Data JPA native query result entitySpring Data JPA 原生查询结果实体
【发布时间】: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;
}

} `

【问题讨论】:

    标签: sql spring spring-boot spring-data-jpa


    【解决方案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 个表使用我的本机查询可能会更困难,它甚至会知道我的实体吗?我什至没有为其中一个表创建实体...我将首先尝试一个具有实体的表,看看我是否可以匹配参数,以及当我将其设为本机查询时会发生什么。
    猜你喜欢
    • 2015-05-18
    • 2017-12-13
    • 2020-01-11
    • 2018-05-08
    • 2019-12-01
    • 1970-01-01
    • 2020-02-15
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多