JPA SqlResultSetMapping 注解无法为非实体执行映射

问题描述 投票:0回答:1

Spring Boot + JPA/Hibernate 在这里。我使用

EntityManager
进行以下查询:

@Component
public class AnalyticsPersistor {

    @PersistenceContext
    private EntityManager entityManager;

    public List<RevenueRank> fetchRevenuRanks(String clientName) {

        String revRankQuery = "SELECT Id, Higher_Level_Entity_Value as Customer_Name, Revenue, Client_Name," +
            "ROW_NUMBER() OVER(ORDER BY Revenue DESC) CustomerRank " +
            "FROM cooperai.analytics.tbl_master_analytics " +
            "where Client_Name LIKE CONCAT('%', :clientName,'%');";

        Query revenueRankQuery = entityManager.createNativeQuery(revRankQuery, RevenueRank.class);
        revenueRankQuery.setParameter("clientName", clientName);

        return revenueRankQuery.getResultList();

    }
}

我正在尝试使用

@SqlResultSetMapping
将此查询的结果映射回
List<RevenueRank>
(重要的是要注意
RevenueRank
不是由表支持的真正的 JPA 实体我只是汇总来自查询并尝试将它们填充到我称为
RevenueRank
的 POJO 中):

@SqlResultSetMapping(
    name="RevenueRankResult",
    entities={
        @EntityResult(
            entityClass = RevenueRank.class,
            fields= {
                @FieldResult(name="Id", column="id"),
                @FieldResult(name="Customer_Name", column="customer_name"),
                @FieldResult(name="Revenue", column="revenue"),
                @FieldResult(name="Client_Name", column="clientName"),
                @FieldResult(name="CustomerRank", column="customerRank")
            }
        )
    }
)
@Data
public class RevenueRank {

    @Id
    private Long id;
    private String customerName;
    private BigDecimal revenue;
    private String clientName;
    private Integer customerRank;

}

当我构建并运行 Spring Boot 应用程序并点击调用此

AnalyticsPersistor#fetchRevenuRanks(String)
方法的 API 端点时,我得到:

org.hibernate.MappingException: Unknown entity: com.me.myapp.RevenueRank

好的。所以也许我只需要将

RevenueRank
指定为
@Entity
?但是当我尝试将
@Entity
添加到
RevenueRank
类时,我得到:

org.hibernate.exception.GenericJDBCException: could not execute query

谁能发现我哪里出错了? 我只需要将这个本机查询的结果映射到我的

RevenueRank
POJO 列表。

spring-boot hibernate jpa entitymanager
1个回答
0
投票

@EntityResult
只能用于实体。要将结果映射到 POJO ,您需要使用
@ConstructorResult
。所以请尝试以下操作:

@SqlResultSetMapping(
    name="RevenueRankResult",
    classes={
        @@ConstructorResult(
            targetClass = RevenueRank.class,
            columns= {
                @ColumnResult(name = "Id"),
                @ColumnResult(name = "Customer_Name"),
                @ColumnResult(name = "Revenue"),
                @ColumnResult(name = "Client_Name"),
                @ColumnResult(name = "CustomerRank")
            }
        )
    }
)
@Data
public class RevenueRank {

    @Id
    private Long id;
    private String customerName;
    private BigDecimal revenue;
    private String clientName;
    private Integer customerRank;

     public RevenueRank(Long id , String customerName, BigDecimal revenue ,
String clientName,Integer customerRank){
    

    }
}

请注意,

RevenueRank
@ColumnResult
中的构造函数参数应该具有相同的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.