Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Hibernuj CriteriaBuilder, aby dołączyć do wielu stołów

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

Zakładam, że zbudowałeś metamodel JPA dla swoich zajęć. Jeśli nie masz metamodelu lub po prostu nie chcesz go używać, po prostu zastąp BuildDetails_.buildNumber a reszta z rzeczywistymi nazwami kolumny jako String , np. "buildNumber" .

Zauważ, że nie mogłem przetestować odpowiedzi (pisałem ją również bez wsparcia edytora), ale powinna ona przynajmniej zawierać wszystko, co musisz wiedzieć, aby zbudować zapytanie.

Jak zbudować swój metamodel? Spójrz na narzędzia do hibernacji w tym celu (lub skonsultuj się z Jak wygenerować metamodel JPA 2.0 ? dla innych alternatyw). Jeśli używasz maven, może to być tak proste, jak dodanie hibernate-jpamodelgen - zależność od ścieżki klasy kompilacji. Ponieważ nie mam obecnie żadnego takiego projektu, nie jestem pewien co do poniższych (więc weź to z przymrużeniem oka). Wystarczy dodać jako zależność:

<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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:FULL OUTER JOIN - Jak połączyć jedną kolumnę?

  2. Jak stworzyć paginację w Codeiginter?

  3. GRUPA MySQL WEDŁUG... MIEJĄCYCH różne wartości w tym samym polu

  4. Problem z Kreatorem źródeł danych MySQL dla programu Visual Studio / Visual Studio 2017. Odwołanie do obiektu nie jest ustawione na instancję obiektu

  5. Java PreparedStatement narzeka na składnię SQL podczas wykonywania()