Criteria Api 中的左外连接

Posted

技术标签:

【中文标题】Criteria Api 中的左外连接【英文标题】:Left Outer Join in Criteria Api 【发布时间】:2019-02-18 20:20:15 【问题描述】:

我正在尝试使用 Criteria API 获取以下查询:

select lang.* from LKUP_LANG lang LEFT OUTER JOIN LANG_SEQUENCES seq ON
lang.SHORT_NAME=seq.LANG_CODE and (lang.DISPLAY_NAME is not null)
order by nvl(seq.SEQ_LANG_CODE, 2147483647) asc;

我做到了:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Lang> criteriaQuery = builder.createQuery(Lang.class);
Root<Lang> languageRoot = criteriaQuery.from(Lang.class);

List<Predicate> predicates = new ArrayList<>();
// added some predicates
criteriaQuery.orderBy(...);

尝试添加

Join<Lang, LANG_SEQUENCES> join = languageRoot.join("languageSequences",JoinType.LEFT);

实体看起来像

LanguageSequences
@Id
@Column(name = "LANG_CODE")
private String langCode;

@Column(name = "SEQ_LANG_CODE")
private int seqLangcode;

@OneToOne
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "LANG_CODE", referencedColumnName = "SHORT_NAME")
private Lang lang;

Lang
@Column(name = "DISPLAY_NAME", unique = true)
private String displayName;

@Id
@Column(name = "SHORT_NAME")
private String shortName;

@OneToOne(cascade = CascadeType.ALL, mappedBy = "lkupLanguage")
private LanguageSequences languageSequences;

尝试以不同的方式使用连接,但看起来我错过了一些东西。我得到了 orderBy,谓词都正确。 我正在使用 JPA 2.1 和 Oracle。

【问题讨论】:

【参考方案1】:

在 JPA 中你不能选择序列,你应该使用原生查询

【讨论】:

以上是关于Criteria Api 中的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQ查询中的左外连接[重复]

Linq中的lambda /方法语法中的左外连接[重复]

Rails 4中的左外连接

sql查询中的左外连接

csharp LINQ中的左外连接

真正的左外连接