JPA expression joins more than two columns

I have the following instruction to combine two columns that work well

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

and SQL

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

I would like to concatenate another column, and SQL -

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

Not sure how to add other columns to the JPA API using CriteriaBuilder and Expression

Change 1

I am looking for concatenation using multiple columns, and the answer that is marked as duplicate does not help to solve the problem, and most importantly, this question is marked and finding a solution to the problem of concatenation relates to the JPA API and, of course, not to JPQL.

+6
source share
1 answer

You can basically wrap concat(...) in each other or use the following method (assuming you want to use the same row of separator between columns):

 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); 
+2
source

All Articles