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(buildDetailsTable.get(BuildDetails_.buildNumber), "1.0.0.1"));
predicates.add(cb.equal(buildDetailsTable.get(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 siêu mô hình JPA cho các lớp học của mình. Nếu bạn không có siêu mô hình hoặc đơn giản là bạn không muốn sử dụng nó, chỉ cần thay thế BuildDetails_.buildNumber
và phần còn lại có tên thực 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 đang viết nó mà không có sự hỗ trợ của trình chỉnh sửa), nhưng ít nhất nó phải chứa mọi thứ bạn cần biết để tạo truy vấn.
Làm thế nào để xây dựng siêu mô hình của bạn? Hãy xem công cụ ngủ đông
cho điều đó (hoặc tham khảo Cách tạo siêu mô hình JPA 2.0 ?
cho các lựa chọn thay thế khác). Nếu bạn đang sử dụng maven, có thể đơn giản chỉ cần thêm hibernate-jpamodelgen
-phụ thuộc vào đường dẫn xây dựng của bạn. Vì tôi không có bất kỳ dự án nào như vậy hiện có sẵn nên tôi không chắc chắn lắm về những điều sau đây (vì vậy hãy xem xét điều đó với một chút muối). Chỉ cần thêm những thứ sau làm phụ thuộc là đủ:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.3.7.Final</version>
<scope>provided</scope> <!-- this might ensure that you do not package it, but that it is otherwise available; untested now, but I think I used it that way in the past -->
</dependency>