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 列表。
@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
中的构造函数参数应该具有相同的顺序。