【问题标题】:JPA Unknown SqlResultSetMapping [duplicate]JPA 未知 SqlResultSetMapping [重复]
【发布时间】:2020-06-26 02:49:32
【问题描述】:

我有

@SqlResultSetMapping(
        name = "OrderDetailsReportMapping",
        entities = @EntityResult(
                entityClass = OrderDetailsReportDto.class,
                fields = {
                    @FieldResult(name = "orderId", column = "col_0_0_"),
                    @FieldResult(name = "orgId", column = "col_1_0_")
}))
public class OrderDetailsReportMapping {

}

和 OrderDetailsReportDto.class:

public class OrderDetailsReportDto {
    private Long orderId;
    private Long orgId;
}

在我的 OrderManager.class 中:

StringBuilder queryView = new StringBuilder("SELECT * FROM order_details_report_view");
        Query dataQuery = em.createNativeQuery(queryView.toString(), "OrderDetailsReportMapping");

但我得到了错误:

Unknown SqlResultSetMapping [OrderDetailsReportMapping]

请帮忙。谢谢。

【问题讨论】:

标签: java jpa


【解决方案1】:

我猜主要问题是entityClass = OrderDetailsReportDto.class@SqlResultSetMapping 中的使用。来自Baeldung的教程"A Guide to SqlResultSetMapping: 5.1 Single Entity"

EntityResult 要求我们指定实体类

您应该使用带有@Entity 注释的类来存储结果。

EDIT#1 例如:

@SqlResultSetMapping(
        name = "OrderDetailsReportMapping",
        entities = @EntityResult(
                entityClass = OrderDetailsView.class,
                fields = {
                        @FieldResult(name = "orderId", column = "first_db_view_col_name"),
                        @FieldResult(name = "orgId", column = "second_db_view_col_name")
                }))
@Entity
@Immutable
public class OrderDetailsView {
    @Id
    private Long orderId;

    private Long orgId;

    @Override
    public String toString() {
        return "OrderDetailsView{" +
                "orderId=" + orderId +
                ", orgId=" + orgId +
                '}';
    }
}
 Query query = em.createNativeQuery(
                "select * from order_details_report_view",
                "OrderDetailsReportMapping");
 List<OrderDetailsView> orderDetailsViews = query.getResultList();

编辑#2 如果"orderId" 不是唯一的,您可以将行号视为 id 列:1, 2

在 Postgres 数据库上测试:

        fields = {
added >>>               @FieldResult(name = "id", column = "fakeId"),
                        @FieldResult(name = "orderId", column = "first_db_view_col_name"),
                        @FieldResult(name = "orgId", column = "second_db_view_col_name")
        }
 em.createNativeQuery(
added >>>       "select row_number() OVER () as \"FakeId\", * "
                + "from order_details_report_view",
                "OrderDetailsReportMapping");

【讨论】:

  • 但是当我使用@Entity 时,我得到了这个错误:没有为实体指定标识符:com.mycompany.OrderDetailsReportMapping。请帮忙。谢谢。
  • 你需要指定你的@Entity@Id,查看更新后的答案
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2018-03-30
  • 2021-11-23
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多