gpt4 book ai didi

java - Criteria API 未生成左外连接

转载 作者:行者123 更新时间:2023-12-02 09:49:15 25 4
gpt4 key购买 nike

我有 3 个实体,事实上,为了简洁起见,还有更多实体连接在一起,我将跳过这些实体,并且使用 open 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 子句,正如少数答案所建议的那样,但它被忽略了,因为联接发生在 where 评估之前。这个问题在某个地方openJPA outer join on optional many-to-one when have order by clause符合我的场景,但无法通过标准 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))));

关于java - Criteria API 未生成左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com