【发布时间】:2021-04-11 08:29:42
【问题描述】:
我有三个表:Company、Share 和 Shareholders。 Share 是 Company 和 Shareholder 之间的连接表。
我希望能够仅提取(显示在 UI 中)这些具有给定 security_id 的股东有权访问/共享的公司。
我的问题是我不知道如何将我的工作 sql 查询转换为将用于搜索的谓词。
我使用 Specification 接口和 PredicateBuilder。
实体(仅包含相关字段):
public class Company {
@Id
@Column(name = "company_id")
private Long id;
@OneToMany(mappedBy = "company")
private Set<Share> shares;
public class Share {
@Id
@Column(name = "share_id")
private Long id;
@ManyToOne
@JoinColumn(name = "company_id")
private Company company;
@ManyToOne
@JoinColumn(name = "shareholder_id")
private Shareholder shareholder;
public class Shareholder {
@Id
@Column(name = "shareholder_id")
private Long id;
@Column
private String securityId;
我在 PredicateBuilder 类中的代码,结果为空:
public CompanyPredicateBuilder access(String securityId) {
Join<Company, Share> joinShare = root.join(Company.PROPERTY_SHAREHOLDERS);
Join<Share, Shareholder> joinShareholder = joinShare.join(Share.PROPERTY_SHAREHOLDER);
Predicate predicate = cb.equal(joinShareholder.get(Shareholder.PROPERTY_SECURITY_ID), securityId);
predicates.add(predicate);
return this;
}
然后调用repo中的findAll(query.createSpecification)方法。
最后是有效的 SQL 查询:
SELECT
*
FROM company
JOIN share
ON company.company_id = share.company_id
JOIN shareholder
ON share.shareholder_id = shareholder.shareholder_id
WHERE
shareholder.security_id = 'example'
任何帮助将不胜感激...谢谢!
【问题讨论】:
标签: java mysql hibernate jpa join