2017-11-17 2 views
0

私は、クラッシュしたサービスに、ネストされた関係を指定して、データベースからすべてを読み取る必要がないように指定する可能性を追加しようとしています。例えばjpa 2基準hibernate 5.2ネストされたジョイン

テイク私はそれらのエンティティ

Company.java

private List<Department> departments; 
private SalaryCode salaryCode; 

Department.java

private List<Employee> employees; 
private Company company; 
private SalaryCode salaryCode; 

Employee.java

private Department department; 
private SalaryCode salaryCode 

そして、私の基準クエリのを持っていますいいえwはこれです:

Session session = sessionFactory.openSession(); 
CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaQuery<T> criteriaQuery = builder.createQuery(clazz); 
Root<T> root = criteriaQuery.from(clazz); 

//nestedRelationships is a varargs passed as parameters 
for(String nestedRelationship : nestedRelationships) { 
    root.fetch(nestedRelationship, JoinType.LEFT); 
} 

List<T> result = session.createQuery(criteriaQuery.select(root)).list(); 

事は、私がnestedRelationshipとして「部門」を指定し、Employeeエンティティを照会する場合、それはうまく動作しますが、私は「department.salaryCode」を指定しようとすると、それは "にできないと言っては動作しませんです指定された名前で属性を見つける "。 もちろん、私は最初に "department"を取り出してから "department.salaryCode"を取っています。

サポートされていますか?はいの場合、どのように動作し、サポートされていない場合、私は何ができますか?

答えて

0

はい、サポートされています。結合を使用する必要があります。

Root<Company> root = criteriaQuery.from(Company.class); 
    Join<Company,Department> joinDepartment = root.join(Company_.departments); 
    Join<Department,SalaryCode> joinSalaryCode = joinDepartment.join(Department_.salaryCode); 

メタモデルクラス(例えば。Department_)を生成するには、hereを見てみましょう。

0

私はちょうど例えばしなければならない、それを使用するには、ルート要素

protected void fetch(Root<T> root, String... joins) { 
    //Sort the joins so they are like this : 
    //A 
    //A.F 
    //B.E 
    //B.E.D 
    //B.G 
    Arrays.sort(joins); 

    Map<String, Fetch> flattenFetches = new HashMap<>(); 

    for (String join : joins) { 
     try { 
      if (join.contains(".")) { 
       String[] subrelations = join.split("\\."); 
       Fetch lastRelation = null; 
       int i; 

       for (i = subrelations.length - 1; i >= 0; i--) { 
        String subJoin = String.join(".", Arrays.copyOf(subrelations, i)); 

        if (flattenFetches.containsKey(subJoin)) { 
         lastRelation = flattenFetches.get(subJoin); 
         break; 
        } 
       } 

       if (lastRelation == null) { 
        lastRelation = root.fetch(subrelations[0], JoinType.LEFT); 
        flattenFetches.put(subrelations[0], lastRelation); 
        i = 1; 
       } 

       for (; i < subrelations.length; i++) { 
        String relation = subrelations[i]; 
        String path = String.join(".", Arrays.copyOf(subrelations, i + 1)); 

        if (i == subrelations.length - 1) { 
         Fetch fetch = lastRelation.fetch(relation, JoinType.LEFT); 
         flattenFetches.put(path, fetch); 
        } else { 
         lastRelation = lastRelation.fetch(relation, JoinType.LEFT); 
         flattenFetches.put(path, lastRelation); 
        } 
       } 
      } else { 
       Fetch fetch = root.fetch(join, JoinType.LEFT); 
       flattenFetches.put(join, fetch); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

を使用して、アルゴリズムを行うことにより、溶液が見つかりました:私はアルゴリズムをコメントしたいと思い

employeeController.getAll("punches", "currentSchedule.shifts", "defaultDepartment.currentSchedule.shifts", 
      "defaultDepartment.company.currentSchedule.shifts", "bankExtras") 

をが、私は時間がないし、それはかなり理解しやすいです

関連する問題