我有三张table:公司、股票和股东。股份是公司和股东之间的一个连接表。
我只想提取(在ui中显示)这些公司,具有给定安全id的股东可以访问/共享这些公司。
我的问题是,我不知道如何将正在工作的sql查询转换为用于搜索的 predicate 。
我使用规范接口和 predicate 生成器。
实体(仅包含相关字段):
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'
任何帮助都将不胜感激。。。谢谢!
1条答案
按热度按时间whlutmcx1#
看起来您在这里使用了一个错误的属性,但我真的看不出这些常量的背后是什么:
root.join(Company.PROPERTY_SHAREHOLDERS);
.为什么不使用hibernate生成的静态元模型来避免这样的问题,同时提高类型安全性呢?