我使用按功能排序遇到了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的行为是不同的,因为它删除了所有交易,其中对客户的引用是空的。
答案 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"));