2016-09-28 147 views
0

我遇到了使用按功能排序的JPA(提供程序:EclipseLink)的奇怪行为。我有TransactionData类,它有参考CustomerData类:使用Criteria API进行嵌套字段排序时缺少行

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

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

在我的项目,有一些特定的情况下,如果有交易,这是不分配给任何客户(称为非客户交易)。

我尝试获取所有注册交易(客户交易和非客户交易)的列表,并按客户的姓氏对其进行分类。要达致这我已经写了以下标准阿比

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:如果你仔细想想SQL需要生产什么

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