如何减少ManyToOne(jpa / hibernate)的查询数量

时间:2017-01-31 18:56:09

标签: hibernate jpa spring-data-jpa

我使用Spring数据jpa和遗留数据库模式,并且在映射其中一个关系时遇到一些问题。数据库buyeremployee中有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 ...

任何帮助都将不胜感激。

1 个答案:

答案 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();