【问题标题】:How to get extra information when calling jpa method in spring 4spring 4调用jpa方法时如何获取额外信息
【发布时间】:2023-03-13 00:11:02
【问题描述】:

表格

table_supplier_bills - bill_id, supplier_id, date

型号

@Entity
@Table(name = "table_supplier_bills")
public class SupplierBill {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="bill_id")
    private Integer billId;

    @Column(name="supplier_id")
    private Integer supplierId;

    @Column(name="date")
    private String date;

    @Column(name="bill_amount")
    @Transient
    private BigDecimal billAmount;

    @Column(name="paid_amount")
    @Transient
    private BigDecimal paidAmount;

    public SupplierBill() {
        super();
    }

    public Integer getBillId() {
        return billId;
    }

    public void setBillId(Integer billId) {
        this.billId = billId;
    }

    public Integer getSupplierId() {
        return supplierId;
    }

    public void setSupplierId(Integer supplierId) {
        this.supplierId = supplierId;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public BigDecimal getBillAmount() {
        return billAmount;
    }

    public void setBillAmount(BigDecimal billAmount) {
        this.billAmount = billAmount;
    }

    public BigDecimal getPaidAmount() {
        return paidAmount;
    }

    public void setPaidAmount(BigDecimal paidAmount) {
        this.paidAmount = paidAmount;
    }
]

存储库

@Query(value = "SELECT SB.bill_id, SB.date, SB.supplier_id,  SUM(SBD.quantity * SBD.rate) as bill_amount,  COALESCE((SELECT SUM(SBPD.payment_amount) FROM table_supplier_bill_payment_details SBPD WHERE SBD.bill_id = SBPD.bill_id ),0.00) as paid_amount from table_supplier_bills SB INNER JOIN table_supplier_bill_details SBD ON SB.bill_id = SBD.bill_id WHERE SB.supplier_id = ?1 group by SBD.bill_id ORDER BY SB.bill_id DESC" , nativeQuery = true)
List<SupplierBill> getSupplierBills(Integer sid);

当我调用上述方法时,我没有从服务中获得 bill_amount 和paid_amount。如果我删除 @Transient 它可以工作,但我无法调用

supplierBillRepository.save(supplierBill); 

因为它抱怨未知列 bill_amount 和paid_amount。

我需要做哪些改变,所以它适用于这两种方法?

【问题讨论】:

  • 你的意思是那些没有持久化的字段(标有@Transient)?你很惊讶它没有在数据存储中找到它们?

标签: spring-mvc jpa spring-boot


【解决方案1】:

所有非持久性字段都应标记为@Transient,因此save()只有在您将这些字段标记为@Transient时才会起作用。

getSupplierBills() 方法中的聚合字段可以通过定义一个单独的 DTO 类(如SupplierBillResults)来获取,如下所示:

public class SupplierBillResults {

        private final Date date;

        private final Integer billId;

        private final Integer supplierId;

        private final BigDecimal billAmount;

        private final BigDecimal paidAmount;

        public SupplierBillResults(Integer billId, Date date, 
              BigDecimal billAmount, BigDecimal paidAmount, Integer supplierId) {
             //set the fields here
        }

        //Generate getters
}

查询方法:

//Add your @Query here
List< SupplierBillResults> getSupplierBillResults(Integer sid);

注意:您可以使用SupplierBillResults DTO 跨层传输数据(如果需要),您可以从SupplierBill 类中删除@Transient 字段,您可以处理这根据您的要求。

编辑存储库代码

@Repository
public interface SupplierBillRepository extends JpaRepository<SupplierBill, Integer> {
    @Query(value = "SELECT SB.bill_id, SB.date, SB.supplier_id,  SUM(SBD.quantity * SBD.rate) as bill_amount,  COALESCE((SELECT SUM(SBPD.payment_amount) FROM table_supplier_bill_payment_details SBPD WHERE SBD.bill_id = SBPD.bill_id ),0.00) as paid_amount from table_supplier_bills SB INNER JOIN table_supplier_bill_details SBD ON SB.bill_id = SBD.bill_id WHERE SB.supplier_id = ?1 group by SBD.bill_id ORDER BY SB.bill_id DESC" , nativeQuery = true)
    List< SupplierBillResults> getSupplierBillResults(Integer sid);
}

【讨论】:

  • 感谢您的回复。进行您建议的更改后,现在我收到此错误 - 找不到能够从 [java.lang.Integer] 类型转换为 [com.example.model.SupplierBillResults] 类型的转换器
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2019-07-30
  • 2016-05-10
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多