2017-02-01 27 views
5

Tôi đang cố gắng tham gia 4 bảng sử dụng Hibernate criteriabuilder ..
Dưới đây là các bảng tương ứng .. 'Hibernate CriteriaBuilder tham gia nhiều bảng

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


Trong những 4 bàn tôi sẽ muốn thực hiện tập lệnh sql bên dưới cho 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' 

Vì vậy, Làm thế nào tôi có thể đạt được điều này bằng cách sử dụng Hibernate CriteriaBuilder? Xin vui lòng giúp ...

Cảm ơn trước .......

+0

câu hỏi đầu tiên là, bạn có thực sự cần sử dụng tiêu chí ở đây .. đây có phải là truy vấn động hay chỉ các tham số sẽ thay đổi? –

+0

yes Tôi phải sử dụng CriteriaBuilder ở đây .... và các tham số cũng sẽ thay đổi ở đây – ktgirish

Trả lời

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

Tôi giả sử bạn xây dựng các metamodel JPA cho lớp học của bạn. Nếu bạn không có metamodel hoặc bạn chỉ đơn giản là không muốn sử dụng nó, chỉ cần thay thế BuildDetails_.buildNumber và phần còn lại với tên thực tế của cột là String, ví dụ: "buildNumber".

Lưu ý rằng tôi không thể kiểm tra câu trả lời (cũng đã viết nó mà không cần hỗ trợ trình soạn thảo), nhưng ít nhất phải chứa mọi thứ bạn cần biết để xây dựng truy vấn.

Các vấn đề liên quan