Внутреннее объединение нескольких таблиц с использованием JPA CriteriaBuilder - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь получить все ресурсы пользователя, но они разделены на несколько таблиц, и у меня возникают проблемы при написании CriteriaBuilder для него.

@Entity
public class Asset {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "company_branch_id")
    private CompanyBranch companyBranch;
}

@Entity
public class CompanyBranch {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "company_id")
    private Company company;

    @OneToMany(mappedBy = "companyBranch")
    private Set<Asset> assets;
}

@Entity
public class Company {
    @Id
    private Long id;

    @ManyToMany(mappedBy = "companies")
    private Set<User> users;

    @OneToMany(mappedBy = "company")
    private Set<CompanyBranch> companyBranches;
}

@Entity
public class User {
    @Id
    private Long id;

    @ManyToMany
    @JoinTable(
        schema = "User",
        name = "user_company",
        joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "company_id", referencedColumnName = "id")})
    private Set<Company> companies;
}

Я хочу иметь возможность создать CriteriaBuilderпохоже на то, как выглядит этот оператор SQL:

SELECT a.* FROM asset a
INNER JOIN company_branch b ON a.company_branch_id = b.id
INNER JOIN company c ON b.company_id = c.id
INNER JOIN user_company d ON c.id = d.company_id
WHERE d.user_id = ?

Как правильно написать мой код CriteriaBuilder для получения правильного результата?

Пока это мой код, но он неКажется, работает:

Root<Asset> assetRoot = query.from(Asset.class);
Join<Asset, CompanyBranch> companyBranchJoin = assetRoot.join("companyBranch", JoinType.INNER);
Join<CompanyBranch, Company> companyJoin = assetRoot.join("company", JoinType.INNER);
Join<Company, User> userJoin = assetRoot.join("users", JoinType.INNER);

Predicate predicate = criteriaBuilder.equal(userJoin.get("UserId"), userId);

query.where(predicate);
...