我正在尝试使用hibernate条件生成器连接4个表。 下面分别是这些表。
@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执行以下sql脚本:
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'
那么,如何使用Hibernate CriteriaBuilder实现这一目标?请帮助…
预先感谢.......
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();
我假设您为类构建了JPA元模型。如果您没有元模型,或者只是不想使用它,只需将BuildDetails_.buildNumber其余的替换为该列的实际名称String,例如"buildNumber"。
BuildDetails_.buildNumber
String
"buildNumber"
请注意,我无法测试答案(也在没有编辑器支持的情况下编写了答案),但是它至少应包含构建查询所需的所有知识。
如何建立元模型?查看用于此的hibernate工具(或参阅“ 如何生成JPA2.0元模型”以了解其他替代方法)。如果您使用的是maven,则只需将hibernate- jpamodelgen-dependency添加到构建类路径即可。由于我现在没有任何这样的项目,因此我不太确定以下内容(因此,请带上一粒盐)。仅添加以下内容作为依赖项可能就足够了:
hibernate- jpamodelgen
<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>