2015-11-25 18 views
6

Ich habe die folgende Anweisung zwei Spalten verketten, das funktioniert gutJPA Expression concatenate mehr als zwei Spalten

Expression<String> stringConcat = 
      cb.concat(cb.concat(root.get(Employee_.userId), " # "), 
            joinDept.get(Employee_.empName)); 

und SQL ist

select emp.user_id|| ' # '|| dept.emp_name from ..  

Ich möchte eine Spalte mehr verketten und SQL

select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..  

Nicht sicher, wie andere Spalten in JPA API mit CriteriaBuilder und Expr hinzufügen ITZUNG

Edit 1

ich für Verkettung Suche mehr Spalten und Antwort verwendet, die als Duplikat markiert hilft nicht, das Problem zu lösen und vor allem dieser Frage ist markiert und die Suche nach Lösung Verkettung Problem zu beheben bezieht sich auf JPA Criteria API und sicherlich nicht auf JPQL.

+0

@TobiasLiefke Könnten Sie bitte erklären, wie zu verwenden mehrere Spalten Verkettung mit Expression? – user75ponic

+0

@TobiasLiefke Ich schlage vor, bitte entfernen Sie doppelte Markierung von der Frage. – user75ponic

+1

Kein Duplikat, da die verknüpfte Antwort sich auf JPQL und nicht auf den Criteria-API-Ansatz bezieht. –

Antwort

2

Sie können im Grunde die concat(...) ineinander schlingen, oder eine Methode, wie die folgende verwenden (vorausgesetzt, Sie die gleiche Trennzeichenfolge zwischen den Spalten verwenden möchten):

private CriteriaBuilder criteriaBuilder = /* ... */ 

// notice the three dots before "expressions", they are no decoration ;-) 
private Expression<String> concat(String delimiter, Expression<String> ... expressions) { 
    Expression<String> result = null; 
    for (int i = 0; i < expressions.length; i++) { 
     final boolean first = i == 0, last = i == (expressions.length - 1); 
     final Expression<String> expression = expressions[i]; 
     if (first && last) { 
      result = expression; 
     } else if (first) { 
      result = criteriaBuilder.concat(expression, delimiter); 
     } else { 
      result = criteriaBuilder.concat(result, expression); 
      if (!last) { 
       result = criteriaBuilder.concat(result, delimiter); 
      } 
     } 
    } 
    return result; 
} 

Expression<String> userId = root.get(Employee_.userId); 
Expression<String> empName = joinDept.get(Employee_.empName); 
Expression<String> userName = hist.get(User_.name); // or whatever 

Expression<String> stringConcat = concat(" # ", userId, empName, userName); 
+0

Ja Begrenzer bleiben gleich. Ich werde diesen Ansatz versuchen. – user75ponic

+0

Ich erhalte einen Kompilierfehler für 'expressions.length' – user75ponic

+1

Welcher Fehler? Hast du die drei Punkte "..." vergessen? Verwenden Sie Java <1.5.x? –