5

`休止CriteriaBuilderは、これらの4つのテーブル私は希望で..私は休止状態criteriabuilder .. <br>以下 テーブルがそれぞれを使用して4つのテーブルを結合しようとしている

@Entity 
public class BuildDetails { 
    @Id 
    private long id; 
    @Column 
    private String buildNumber; 
    @Column 
    private String buildDuration; 
    @Column 
    private String projectName; 

} 

@Entity 
public class CodeQualityDetails{ 
    @Id 
    private long id; 
    @Column 
    private String codeHealth; 
    @ManyToOne 
    private BuildDetails build; //columnName=buildNum 
} 

@Entity 
public class DeploymentDetails{ 
    @Id 
    private Long id; 
    @Column 
    private String deployedEnv; 
    @ManyToOne 
    private BuildDetails build; //columnName=buildNum 
} 

@Entity 
public class TestDetails{ 
    @Id 
    private Long id; 
    @Column 
    private String testStatus; 
    @ManyToOne 
    private BuildDetails build; //columnName=buildNum 
} 


を複数のテーブルを結合しますMySQLのために以下のSQLスクリプトを実行したい:

SELECT b.buildNumber, b.buildDuration, 
     c.codeHealth, d.deployedEnv, t.testStatus 
FROM BuildDetails b 
INNER JOIN CodeQualityDetails c ON b.buildNumber=c.buildNum 
INNER JOIN DeploymentDetails d ON b.buildNumber=d.buildNum 
INNER JOIN TestDetails t ON b.buildNumber=t.buildNum 
WHERE b.buildNumber='1.0.0.1' AND 
     b.projectName='Tera' 

これで、Hibernate CriteriaBuilderを使用してこれをどのように達成できますか?私はあなたがあなたのクラスのJPAのメタモデルを構築しました仮定....... ...

+0

最初の質問は、本当にここの基準を使用する必要がありますか?これは動的クエリになるか、単にパラメータが変更されますか? –

+0

はいここでCriteriaBuilderを使用する必要があります...また、パラメータもここで変更されます – ktgirish

答えて

5
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery query = cb.createQuery(/* Your combined target type, e.g. MyQueriedBuildDetails.class, containing buildNumber, duration, code health, etc.*/); 

Root<BuildDetails> buildDetailsTable = query.from(BuildDetails.class); 
Join<BuildDetails, CopyQualityDetails> qualityJoin = buildDetailsTable.join(CopyQualityDetails_.build, JoinType.INNER); 
Join<BuildDetails, DeploymentDetails> deploymentJoin = buildDetailsTable.join(DeploymentDetails_.build, JoinType.INNER); 
Join<BuildDetails, TestDetails> testJoin = buildDetailsTable.join(TestDetails_.build, JoinType.INNER); 

List<Predicate> predicates = new ArrayList<>(); 
predicates.add(cb.equal(BuildDetails_.buildNumber, "1.0.0.1")); 
predicates.add(cb.equal(BuildDetails_.projectName, "Tera")); 

query.multiselect(buildDetails.get(BuildDetails_.buildNumber), 
        buildDetails.get(BuildDetails_.buildDuration), 
        qualityJoin.get(CodeQualityDetails_.codeHealth), 
        deploymentJoin.get(DeploymentDetails_.deployedEnv), 
        testJoin.get(TestDetails_.testStatus)); 
query.where(predicates.stream().toArray(Predicate[]::new)); 

TypedQuery<MyQueriedBuildDetails> typedQuery = entityManager.createQuery(query); 

List<MyQueriedBuildDetails> resultList = typedQuery.getResultList(); 

を事前に

感謝を助けてください。メタモデルがない場合、または単に使用したくない場合はBuildDetails_.buildNumberを置き換え、残りは実際の列名をStringと置き換えてください。 "buildNumber"。私は答えをテストすることができませんでした

注(またエディタのサポートなしでそれを書いていた)が、それは、少なくともあなたは、クエリを構築するために知っておく必要があるすべてのものを含める必要があります。

関連する問題