java—如何将这个工作sql语句转换为jpa criteriabuilder?

7xllpg7q  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(375)

我有三张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'

任何帮助都将不胜感激。。。谢谢!

whlutmcx

whlutmcx1#

看起来您在这里使用了一个错误的属性,但我真的看不出这些常量的背后是什么: root.join(Company.PROPERTY_SHAREHOLDERS); .
为什么不使用hibernate生成的静态元模型来避免这样的问题,同时提高类型安全性呢?

相关问题