簡體   English   中英

條件API未生成左外部聯接

[英]Criteria API is not generating left outer join

我有3個實體,實際上為了簡潔起見,還有更多的實體聯合在一起,我跳過了這些實體,並且我使用的是開放jpa 2.2.2和oracle 11g。 有什么想法怎么了?

Entity SystemRules{
@OneToMany(mappedBy = "systemRule", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<ServiceActionMap> serviceActionMap;
}

Entity ServiceActionMap{
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "SYSTEM_RULE_ID")
    private SystemRules systemRule;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "RFS_TYPE_ID", nullable = true)
    private RfsTypeMap rfsType;
}

Entity RfsTypeMap{
    @Id
    @Column(name="RFS_TYPE_ID" ,nullable=false)
    private BigDecimal rfsTypeId;

    @Column(name="RFS_NAME")
    private String rfsName;
}

現在,我嘗試按RfsTypeMap.rfsName排序結果,我以以下方式使用條件構建器創建查詢

CriteriaQuery<SystemRules> query = cb.createQuery(SystemRules.class);
Root<SystemRules> root= query.from(SystemRules.class);
root.fetch(SystemRules_.serviceActionMap).fetch(ServiceActionMap_.rfsType, JoinType.LEFT);

我的order by子句是這樣的

cb.desc(cb.upper(systemRules.get("serviceActionMap").get("rfsType").get("rfsName").as(String.class)));

生成JPQL看起來像,在這里我希望ServiceActionMap和RfsTypeMap之間有一個左外部聯接子句,但它丟失了。 相同的內容在SQL中被轉換,我想念那些具有ServiceActionMap.rfsType作為空值的記錄。

SELECT  DISTINCT s FROM SystemRules s INNER JOIN FETCH s.serviceActionMap  INNER JOIN FETCH s.serviceActionMap  INNER JOIN FETCH s.ruleProperty  INNER JOIN FETCH s.ruleProperty where ... ORDER BY UPPER(s.serviceActionMap.rfsType.rfsName)

我嘗試在此處遍歷幾個答案,但沒有成功,嘗試像在幾個答案中建議的那樣,顯式地將ServiceActionMap.rfsType的where子句放置為null,但是由於聯接發生在where評估之前,因此它被忽略了。 當order by子句與我的方案匹配時,這個問題在可選多對一問題上的openJPA外部聯接符合我的情況,但無法通過標准API生成建議的JPQL。

我在apache jira https://issues.apache.org/jira/browse/OPENJPA-2318上發現了一個相關的錯誤。 但是,不確定情況是否如此。

我看到每個聯接都重復兩次,甚至聯接別名也始終引用SystemRules。 可能是orderby導致了重復的內部聯接,我們可能需要顯式地使用Join對象來引用擴展列。

CriteriaQuery<SystemRules> query = cb.createQuery(SystemRules.class);
Root<SystemRules> root = query.from(SystemRules.class);
Join<SystemRules, ServiceActionMap> join1 = root.join(SystemRules_.serviceActionMap, JoinType.INNER);
Join<ServiceActionMap, RfsTypeMap> join2 = join1.join(ServiceActionMap_.rfsType, JoinType.LEFT);
query.orderBy(cb.desc(cb.upper(join2.get(RfsTypeMap_.rfsName))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM