Hibernate CriteriaBuilder连接多个表

我正在尝试使用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"

请注意,我无法测试答案(也在没有编辑器支持的情况下编写了答案),但是它至少应包含构建查询所需的所有知识。

如何建立元模型?查看用于此的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>

以上是 Hibernate CriteriaBuilder连接多个表 的全部内容, 来源链接: utcz.com/qa/426572.html

回到顶部