5

Ich versuche, 4 Tische zu verbinden sind mit Hibernate criteriabuilder ..
Nachfolgend finden Sie die Tabellen jeweils .. `Hibernate CriteriaBuilder mehrere Tabellen verbinden

@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 
} 


In diesen 4 Tabellen würde ich wie der unten stehenden sQL-Skript für MySQL ausführen:

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' 

Also, wie kann ich dies mithilfe von Hibernate CriteriaBuilder erreichen? Bitte helfen ...

Vielen Dank im Voraus .......

+0

die erste Frage ist, müssen Sie wirklich Kriterien hier verwenden .. ist dies eine dynamische Abfrage .. oder nur die Parameter ändern sich? –

+0

ja ich muss hier CriteriaBuilder verwenden .... und auch hier ändern sich die Parameter – ktgirish

Antwort

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(); 

Ich nehme an, Sie das PPV-Metamodell für Ihre Klassen gebaut. Wenn Sie das Metamodell nicht haben oder es einfach nicht verwenden möchten, ersetzen Sie einfach BuildDetails_.buildNumber und den Rest durch die tatsächlichen Namen der Spalte als String, z. "buildNumber".

Beachten Sie, dass ich die Antwort nicht testen konnte (es wurde auch ohne Editor-Unterstützung geschrieben), aber es sollte mindestens alles enthalten, was Sie wissen müssen, um die Abfrage zu erstellen.