Spring 弹簧靴中有多个或多个条件的内部连接

Spring 弹簧靴中有多个或多个条件的内部连接,spring,jpa,spring-data-jpa,spring-data,hibernate-criteria,Spring,Jpa,Spring Data Jpa,Spring Data,Hibernate Criteria,我正在使用spring引导规范,并尝试执行一个如下所示的查询- SELECT DISTINCT p.name FROM partner p INNER JOIN detail d ON p.detail_id = d.id INNER JOIN account a ON d.account_id = a.id OR d.crm_id = a.top_parent OR d.crm_id = a.glo

我正在使用spring引导规范,并尝试执行一个如下所示的查询-

SELECT DISTINCT
    p.name
FROM
    partner p
        INNER JOIN
    detail d ON p.detail_id = d.id
        INNER JOIN
    account a ON d.account_id = a.id
        OR d.crm_id = a.top_parent
        OR d.crm_id = a.global_partner
我已经使用了代码

  Join<Partner, Detail> details = root.join("detail");
  Join<Detail, Account> account = details.join("account");
  Predicate global = cb.equal(details.get("crm_id "), account.get("top_parent"));
  Predicate top = cb.equal(details.get("crm_id "), account.get("global_partner"));
  account.on(cb.or(global, top));
请注意查询中的AND运算符…我需要替换它或运算符

另一个我正在努力解决的用例 我使用了下面的代码

cq.orderBy(cb.desc(cb.size(details.get("skills"))));
但它生成的查询是

order by (select count(s.detail_id) from skill s where detail.id = s.detail_id) desc

请注意,我无法在order by子句中添加额外的AND,我相信您无法更改该AND。 您能用以下方式更改查询吗

SELECT DISTINCT p.name
FROM partner p INNER JOIN detail d ON p.detail_id = d.id, account a
where d.account_id = a.id
OR d.crm_id = a.top_parent
OR d.crm_id = a.global_partner
而jpa的标准与

    Join<Partner, Detail> details = root.join("detail");
    Root<Account> account = criteria.from(Account.class);
    Predicate global = cb.equal(details.get("crm_id"), account.get("top_parent"));
    Predicate top = cb.equal(details.get("crm_id"), account.get("global_partner"));
    Predicate byId = cb.equal(details.get("account").get("id"), account.get("id"));
    Predicate or = cb.or(global, top, byId);
    criteria.where(or);
Join details=root.Join(“detail”);
根帐户=条件.来源(帐户.类别);
谓词global=cb.equal(details.get(“crm_id”)、account.get(“top_parent”);
谓词top=cb.equal(details.get(“crm_id”)、account.get(“global_partner”);
谓词byId=cb.equal(details.get(“account”).get(“id”)、account.get(“id”);
谓词or=cb.or(全局、顶部、byId);
标准。其中(或);

您应该考虑使用@ Maulou7解决方案来替换,否则将导致一个完整的表扫描和过滤之后。由于全表扫描,这将导致性能不佳。非常感谢,@tremendous7…我实现了您提供的解决方案,它成功了。我已经为此挣扎了4天。我被另一个用例困住了,我需要在ORDERBY子句中有一个子查询。我挣扎了一个星期。后来,我知道JPA不支持ORDERBY子句中的子查询。。。请您提出解决方案好吗?@Tapan您是否有一个关于您需要什么的小示例查询?谢谢,@tremendous7…我无法在评论中添加详细信息。因此,我已经用另一个我一直在努力解决的用例更新了我的帖子。@Tapan我将抛出几个想法:对于包含非空策略内部细节的技能计数,你能有一个冗余的持久性属性吗?如果可以,您可以按该属性进行排序。否则,如果您的技能包含详细信息参考,您是否可以选择另一种方法:选择计数(Skill.id)、Skill.strategy from Skill where Skill.strategy不为空的Skill.group by Skill.Detail order by count(Skill.id)desc?否则,您可以用java进行排序吗?
order by (select count(s.detail_id) from skill s where detail.id = s.detail_id) desc
SELECT DISTINCT p.name
FROM partner p INNER JOIN detail d ON p.detail_id = d.id, account a
where d.account_id = a.id
OR d.crm_id = a.top_parent
OR d.crm_id = a.global_partner
    Join<Partner, Detail> details = root.join("detail");
    Root<Account> account = criteria.from(Account.class);
    Predicate global = cb.equal(details.get("crm_id"), account.get("top_parent"));
    Predicate top = cb.equal(details.get("crm_id"), account.get("global_partner"));
    Predicate byId = cb.equal(details.get("account").get("id"), account.get("id"));
    Predicate or = cb.or(global, top, byId);
    criteria.where(or);