CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(/ Your combined target type, e.g. MyQueriedBuildDetails.class, containing buildNumber, duration, pre 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_.preHealth), 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();
我假设您为类构建了JPA元模型。如果您没有元模型,或者只是不想使用它,只需将
BuildDetails_.buildNumber其余的替换为该列的实际名称
String,例如
"buildNumber"。
请注意,我无法测试答案(也在没有编辑器支持的情况下编写了答案),但是它至少应包含构建查询所需的所有知识。
如何建立元模型?查看用于此的hibernate工具(或参阅“ 如何生成JPA2.0元模型”以了解其他替代方法)。如果您使用的是maven,则只需将
hibernate-jpamodelgen-dependency添加到构建类路径即可。由于我现在没有任何这样的项目,因此我不太确定以下内容(因此,请带上一粒盐)。仅添加以下内容作为依赖项可能就足够了:
<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>



