2015-11-25 10 views
6

Ho la seguente dichiarazione per concatenare due colonne che funziona beneJPA Expression concatenare più di due colonne

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

e SQL è

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

vorrei per concatenare un altro colonna e SQL è

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

Non sono sicuro di come aggiungere altre colonne JPA API utilizzando CriteriaBuilder e Expr ESSIONE

Modifica 1

Sto cercando per la concatenazione con più colonne e risposta che è contrassegnato come duplicato non aiuta a risolvere il problema e, soprattutto, a questa domanda è etichettato e cercando la soluzione per risolvere problema di concatenazione appartiene all'API dei criteri JPA e certamente non a JPQL.

+0

@TobiasLiefke Potrebbe spiegare come utilizzare concatenazione di più colonne con Expression? – user75ponic

+0

@TobiasLiefke Suggerisco di rimuovere il marchio duplicato dalla domanda. – user75ponic

+1

Non un duplicato, poiché la risposta collegata fa riferimento a JPQL e non all'approccio API Criteria. –

risposta

2

Si può sostanzialmente avvolgere la concat(...) l'uno nell'altro, o di utilizzare un metodo simile al seguente (supponendo che si desidera utilizzare la stessa stringa di delimitazione tra le colonne):

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

Sì, il delimitatore rimane uguale. Proverò questo approccio. – user75ponic

+0

Ricevo un errore di compilazione per 'expressions.length' – user75ponic

+1

Che errore? Hai dimenticato i tre punti "..."? Stai usando Java <1.5.x? –

Problemi correlati