【问题标题】:Join 2 tables using Spring JPA使用 Spring JPA 连接 2 个表
【发布时间】:2020-04-17 04:43:13
【问题描述】:

我有两个实体(Invoice 和 InvoiceItems),没有添加任何关系。

发票

public class Invoice {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long invoiceID;

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

       //other columns
    }

发票项目

public class InvoiceItems {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long invItemID;

    @Column(name="invoice_id")
    private Integer invoiceId;

    //other columns
}

我可以在不使用 JPA 添加关系的情况下加入这些实体并获取数据吗? 如果无法使用 JPQL 或 Native 查询连接 2 个实体?

【问题讨论】:

    标签: spring jpa spring-data-jpa


    【解决方案1】:

    如果您的数据有效,则可以使用本机查询

    @Query(nativeQuery = true, "select * from Invoice i join InvoiceItems im on i.id = im.invoice_id")
    public List<Invoice> findData();
    

    但这不是使用 JPA 进行无关系连接的好方法。

    【讨论】:

    • 你试过这个解决方案了吗?还是面临任何问题?
    【解决方案2】:

    是的,你可以加入这些实体并使用JPA不添加关系获取数据,但它有点失去使用JPA的目的。

    您需要先创建一个 java 类,它将作为从 DB 返回的数据对象。之后就可以使用 entityManager 的 createNamedQuery 方法来获取结果了。

    createNamedQuery(String sqlString, ResultClass.Class)
    

    sqlString 可能类似于:

    SELECT INV.INVOICE_ID
           INV.CODE
           INV_ITEMS.INV_ITEM_ID
      FROM INVOICE INV
      JOIN INVOICE_ITEMS INV_ITEMS
        ON INV.INVOICE_ID = INV_ITEMS.INVOICE_ID;
    

    以及对应的ResultClass:

    public class ResultClass {
    
        private Long invoiceID;
        private String code;
        private Long invItemID;
    
        // other columns
    }
    

    或者您甚至可以使用带有 query() 方法的 JdbcTemplate 自己使用 RowMapper 来映射对象以获得更大的灵活性。

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 2021-12-15
      • 2019-02-05
      • 1970-01-01
      • 2019-08-26
      • 2022-09-28
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多