2016-09-28 65 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")); 
相關問題