【问题标题】:Missing rows when ordering by nested field using Criteria Api使用 Criteria Api 按嵌套字段排序时缺少行
【发布时间】:2016-09-28 02:37:29
【问题描述】:

我遇到过使用按功能排序的 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;
    //...
}

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

我尝试获取所有已注册交易(包括客户交易和非客户交易)的列表,并按客户的姓氏对它们进行排序。为了实现这一点,我按照 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 的行为不同,因为它切断了所有对客户的引用为空的交易。

【问题讨论】:

  • 如果您考虑需要生成什么 SQL,type of 是有意义的。

标签: java jpa criteria-api


【解决方案1】:

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"));

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2018-10-22
    • 2019-10-25
    • 2021-08-07
    • 2015-03-15
    相关资源
    最近更新 更多