使用Criteria Api按嵌套字段排序时缺少行

时间:2016-09-28 02:37:30

标签: java jpa criteria-api

我使用按功能排序遇到了JPA(提供程序:EclipseLink)的奇怪行为。我有TransactionData类,它引用了CustomerData类:

@Entity
public class TransactionData {
    //...
    @ManyToOne
    @JoinColumn(name = "CUSTOMER_ID")
    private CustomerData customer;
    //...
}

@Entity
public class CustomerData {
    //...
    @Column(name = "LAST_NAME")
    private String lastName;
    //...
}

在我的项目中,存在一些特定情况,其中存在未分配给任何客户的交易(称为非客户交易)。

我尝试获取所有已注册交易(包括cusotmer交易和非客户交易)的清单,并按客户的姓氏对其进行排序。为了实现这一点,我已经按照Criteria Api编写了

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<TransactionData> criteriaQuery = criteriaBuilder.createQuery(TransactionData.class);
Root<TransactionData> from = criteriaQuery.from(TransactionData.class);
criteriaQuery.orderBy(criteriaBuilder.asc(from.get("customer").get("lastName"));
TypedQuery<TransactionData> query = entityManager.createQuery(criteriaQuery);
return query.getResultList();

我认为我应该获得所有交易的列表,当然,还有那些客户字段设置为NULL值的交易。但JPA的行为是不同的,因为它删除了所有交易,其中对客户的引用是空的。

1 个答案:

答案 0 :(得分:0)

from.get("customer").get("lastName")将隐式执行INNER JOIN。如果某些交易没有分配客户,那么您需要的是LEFT JOIN:

Join<TransactionData , CustomerData> customer = from.join("customer", JoinType.LEFT);
criteriaQuery.orderBy(criteriaBuilder.asc(customer.get("lastName"));