我有两个实体(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个实体?
如果您的数据是有效的,那么使用本机查询可以执行
@Query(nativeQuery = true, "select * from Invoice i join InvoiceItems im on i.id = im.invoice_id")
public List<Invoice> findData();
但使用JPA进行无关系联接并不是一个好方法。
是的,您可以加入这些实体并获取数据,而无需使用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
}
或者,您甚至可以使用RowMapper来映射对象,通过使用JdbcTemplate和query((方法来获得更大的灵活性。