【问题标题】:Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:不是托管类型:
【发布时间】:2019-04-16 10:38:45
【问题描述】:

下面是我的普通 POJO 对象,它具有所有映射。请注意,它不是 Entity 对象。

import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@AllArgsConstructor
@SqlResultSetMapping(name = "refundReportMapping", classes = { @ConstructorResult(targetClass = RefundReport.class, columns = {
        @ColumnResult(name = "customer_name"),
        @ColumnResult(name = "hashed_email"), @ColumnResult(name = "address"),
        @ColumnResult(name = "partner_order"),
        @ColumnResult(name = "refund_amount") }) })
@NamedNativeQuery(name = "findRefundReportByStatusNamesParamsNative", query = "SELECT concat(bd.first_name,' ',bd.last_name) as 'customer_name',bd.email_address AS 'hashed_email',concat(bd.address1,' ',bd.address2) AS 'address',"
        + o.reservation_id AS 'partner_order',"
        + "(oa.principal_amount+oa.shipping_amount+oa.tax_amount) AS 'refund_amount'"
        + "FROM orders o, order_adjustments oa WHERE oa.status = :status"
        + "and o.buyer_detail_id=bd.buyer_detail_id and o.reservation_id=oa.order_id", resultClass = RefundReport.class, resultSetMapping = "refundReportMapping")
public class RefundReport {

    private String customerName, email, address, 
            partnerOrder;
    private BigDecimal partilaRefundAount;

}
public interface RefundReportRepository extends
        Repository<RefundReport, String> {

    List<RefundReport> findRefundReportByStatus(
            @Param("status") String status);

}

【问题讨论】:

  • SqlResultSetMapping 和 NamedNativeQuery 注释需要在实体上,而不是在非实体 POJO 上。 stackoverflow.com/a/49536120/1116320
  • 我也尝试过提供实体,但它需要标识符。我的 pojo 没有任何 Id 列。
  • 我也尝试过提供实体,但它需要标识符。我的 pojo 没有任何 Id 列。所以我的问题是我们可以在实体中定义一个标识符而不在表中包含 ID id 列。

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


【解决方案1】:

这段代码存在多个问题。

  1. Repository 需要两个类型参数。它是存储库的实体类型和 id 类型的类型。在没有说明这些类型的情况下,Spring Data 为这两种类型都确定了Object,因为Object 不是托管实体。此外,如果您打算使用 RefundReport,它需要是 JPA 托管实体。

  2. 正如@HaseebR7 所指出的,命名查询等的注释也必须在实体上。

由于您似乎只想执行查询,因此您可以使用任何实体,但它必须是具有 id 的正确实体。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2016-06-09
    • 2011-11-24
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多