【问题标题】:CriteriaBuilder join two tables with a custom conditionCriteriaBuilder 使用自定义条件连接两个表
【发布时间】:2016-07-24 05:09:57
【问题描述】:

我想写这个 SQL 查询

SELECT *  
FROM A
LEFT OUTER JOIN B
ON A.IDRESOURCE=B.IDRESOURCE AND B.IDLANGUAGE=22;

使用 JPA 标准生成器。 我简单地写了连接的第一部分:

CriteriaQuery<A> searchQuery = criteriaBuilder.createQuery(A.class);
Root<A> aRoot = searchQuery.from(A.class);
Join<A, B> bJoin= aRoot.join("mappedB", JoinType.LEFT);

但我不知道如何实现条件 B.IDLANGUAGE=22。

有没有办法在 Criteria Builder 中实现这一点?

【问题讨论】:

  • 什么是映射B
  • 嗨@charu joshi。这是属性名称。见javadoc

标签: java jpa criteria-api


【解决方案1】:

使用 JPA 2.1 ONJOIN 部分指定它,这与WHERE 中的相同

CriteriaQuery<A> searchQuery = criteriaBuilder.createQuery(A.class);
Root<A> aRoot = searchQuery.from(A.class);
Join<A, B> bJoin= aRoot.join("mappedB", JoinType.LEFT);
bJoin.on(criteriaBuilder.equal(bJoin.get("idLanguage"), 22));

【讨论】:

  • 如果我想在同一个 SQL 中为表 A 的字段再添加一个条件怎么办?
  • ... bJoin.on(criteriaBuilder.equal(bJoin.get("idResource"), aRoot.get("idResource")), criteriaBuilder.equal(bJoin.get("idLanguage"), 22));
【解决方案2】:

使用whereCriteriaBuilder.equal

em.select(aRoot).where( criteriaBuilder.equal(bJoin.get("IdLanguage"), 22));

【讨论】:

  • 你好@尼古拉斯。加入后,EM 的 Where 是否有效?我的问题是条件必须作为 Join 条件运行,而不是作为 where contition
  • 应该可以,我已经用过很多次了。它知道连接,因为您在 where 子句中使用了 bJoin
  • 这在语义上与在连接条件中指定谓词不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2017-11-14
  • 1970-01-01
  • 2016-11-18
  • 2019-10-05
相关资源
最近更新 更多