首页 > 解决方案 > jpa 2、使用类型sage查询,避免查询嵌套实体

问题描述

我正在使用 JPA 2.2 和 Hibernate 5.2 实现。

我有以下实体:

public class Order implements Serializable {
    private String customer;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn((name = "ID", referencedColumnName = "ID_ORDER")
    private Shipping shipping;

    ... get and set
}

现在我只想在一次选择中查询订单字段(没有嵌套实体属性​​)。

这是我的代码:

final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Order> criteria = criteriaBuilder.createQuery( Order.class );
final Root<Order> orderRoot = criteria.from( Order.class );
criteria.where( criteriaBuilder.equal( orderRoot.get( Order_.customer ), customer ) );
criteria.orderBy(criteriaBuilder.desc(orderRoot.get(Order_.dt)));
final List<Order> output = entityManager.createQuery( criteria ).getResultList();
return output;

通过设置 hibernate show_sql=true,在我的单元测试中,我发现对于每个结果都有一个用于运输实体属性的选择。就像是:

 select order0_.id, order0_.customer from Order ..
 select ordershipping0_.id, ordershipping0_.email from Shipping ...
 select ordershipping0_.id, ordershipping0_.email from Shipping ...
 select ordershipping0_.id, ordershipping0_.email from Shipping ...
 select ordershipping0_.id, ordershipping0_.email from Shipping ...

我怎样才能避免这种情况?

为 Order 选择特定的列会更好,尽管我想始终返回Order

PS 我希望使用JPA本机代码,如果可能的话没有Hibernate特定的实现

编辑 我注意到如果nestedProperty 有一个referencedColumn to parent.pk 列,则会自动获取实体。无论如何这听起来很奇怪

标签: hibernatejpajpa-2.2

解决方案


推荐阅读