5

मैं 4 टेबल में शामिल होने के हाइबरनेट criteriabuilder ..
नीचे टेबल क्रमशः का उपयोग कर कोशिश कर रहा हूँ कई तालिकाओं में शामिल होने .. `हाइबरनेट CriteriaBuilder

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


इन 4 टेबल मैं करूंगा में MySQL के लिए नीचे दिए गए एसक्यूएल स्क्रिप्ट निष्पादित करना चाहते:

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' 

तो, मैं हाइबरनेट मानदंडबिल्डर का उपयोग करके इसे कैसे प्राप्त कर सकता हूं? कृपया मदद ...

धन्यवाद अग्रिम में .......

+0

पहला सवाल यह है कि, क्या आपको वास्तव में यहां मानदंडों का उपयोग करने की आवश्यकता है .. क्या यह एक गतिशील क्वेरी होगी .. या सिर्फ पैरा बदल जाएंगे? –

+0

हाँ मुझे यहां मानदंडबिल्डर का उपयोग करना है .... और पैरामीटर भी यहां बदल जाएंगे – 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"

ध्यान दें कि मैं जवाब का परीक्षण नहीं कर सका (इसे संपादक समर्थन के बिना भी लिख रहा था), लेकिन कम से कम उस प्रश्न को कम करना चाहिए जिसे आपको क्वेरी बनाने के लिए जानने की आवश्यकता है।