sql >> Databáze >  >> RDS >> Mysql

Hibernate CriteriaBuilder pro spojení více tabulek

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

Předpokládám, že jste vytvořili metamodel JPA pro své třídy. Pokud metamodel nemáte nebo jej jednoduše nechcete používat, stačí nahradit BuildDetails_.buildNumber a zbytek se skutečnými názvy sloupce jako String , např. "buildNumber" .

Všimněte si, že jsem nemohl otestovat odpověď (také jsem ji psal bez podpory editoru), ale měla by obsahovat alespoň vše, co potřebujete vědět k sestavení dotazu.

Jak vytvořit svůj metamodel? Podívejte se na nástroje pro hibernaci za tím účelem (nebo se podívejte na Jak vygenerovat metamodel JPA 2.0 ? pro jiné alternativy). Pokud používáte maven, může to být stejně jednoduché jako přidání hibernate-jpamodelgen -závislost na vaší třídě sestavení. Vzhledem k tomu, že nyní nemám žádný takový projekt k dispozici, nejsem si tak jistý následujícími (takže to berte s rezervou). Může stačit přidat následující jako závislost:

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



  1. spouštění postgresql a pgadmin ve Windows bez instalace

  2. Jak povolit explicit_defaults_for_timestamp?

  3. Haversine a Laravel

  4. Jak CHARSET() funguje v MariaDB