我使用Spring数据jpa和遗留数据库模式,并且在映射其中一个关系时遇到一些问题。数据库buyer
和employee
中有2个实体。一名员工可以拥有多个买家,因此从买家到员工之间的关系为ManyToOne
。
这就是我配置jpa / hibernate实体的方法:
@Entity
@Table(name = "BUYER")
public class BuyerEntity {
@Id
@Column(name = "BUYER")
private Long id;
@ManyToOne
@JoinColumn(name = "EMPLOYEE_ID")
private EmployeeEntity employee;
....
和
@Entity
@Table(name = "EMPLOYEE")
public class EmployeeEntity {
@Id
@Column(name = "EMPLOYEE_ID")
private Long id;
....
基本上,buyer
表的外键Employee_Id
指向employee
表的主键。
当我对买家进行查询时,jpa / hibernate首先进行查询以获取所有买家,然后对于每个买家,它运行另一个查询以检索相应的员工信息。这非常低效,因为我们可以通过在第一个查询中添加员工表列来轻松检索员工信息以及买方信息。
所以不要先做一个看起来像这样的查询:
select buyer.id from buyer join employee ...
然后为每个买家做另一个查询:
select employee.* from employee where employee.id = ?
如果我们可以建议jpa / hibernate执行这样的单个查询:
select buyer.*, employee.* from buyer join employee ...
任何帮助都将不胜感激。
答案 0 :(得分:1)
您应该能够发出以下查询来实现目标:
SELECT b FROM BuyerEntity b JOIN FETCH b.employee
你会注意到我在申请JOIN FETCH
,告诉Hibernate不仅要将EmployeeEntity
表加入BuyerEntity
表,还要将数据作为一部分提取到关系中对数据库的单个查询。
如果您想使用JPA Criteria API
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<BuyerEntity> query = cb.createQuery( BuyerEntity.class );
Root<BuyerEntity> root = query.from( BuyerEntity.class );
// specify join-fetch
root.fetch( "employee", JoinType.INNER );
query.select( root );
List<BuyerEntity> results = entityManager.createQuery( query ).getResultList();