使用条件 Api 按嵌套字段排序时缺少行
Missing rows when ordering by nested field using Criteria Api
我遇到过使用按功能排序的 JPA(提供者:EclipseLink)的奇怪行为。我有 TransactionData class,它引用了 CustomerData class:
@Entity
public class TransactionData {
//...
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID")
private CustomerData customer;
//...
}
@Entity
public class CustomerData {
//...
@Column(name = "LAST_NAME")
private String lastName;
//...
}
在我的项目中,有一些特定的情况,其中有交易,没有分配给任何客户(称为非客户交易)。
我尝试获取所有已注册交易(包括客户交易和非客户交易)的列表,并按客户的姓氏对它们进行排序。为了实现这一点,我写了以下标准 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 行为不同,因为它切断了所有事务,其中对客户的引用为空。
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"));
我遇到过使用按功能排序的 JPA(提供者:EclipseLink)的奇怪行为。我有 TransactionData class,它引用了 CustomerData class:
@Entity
public class TransactionData {
//...
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID")
private CustomerData customer;
//...
}
@Entity
public class CustomerData {
//...
@Column(name = "LAST_NAME")
private String lastName;
//...
}
在我的项目中,有一些特定的情况,其中有交易,没有分配给任何客户(称为非客户交易)。
我尝试获取所有已注册交易(包括客户交易和非客户交易)的列表,并按客户的姓氏对它们进行排序。为了实现这一点,我写了以下标准 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 行为不同,因为它切断了所有事务,其中对客户的引用为空。
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"));