2015-11-25 27 views
6

Tôi đã báo cáo kết quả sau đây để nối hai cột mà hoạt động tốtJPA Biểu CONCATENATE hơn hai cột

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

và SQL được

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

Tôi muốn nối thêm một cột và SQL là

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

Không chắc chắn cách thêm các cột khác trong API JPA bằng cách sử dụng CriteriaBuilder và Expr ession

Sửa 1

Tôi đang tìm kiếm nối sử dụng nhiều cột và câu trả lời được đánh dấu là trùng lặp không giúp giải quyết vấn đề và quan trọng nhất là câu hỏi này được gắn thẻ và tìm kiếm giải pháp giải quyết vấn đề nối liên quan đến API tiêu chí JPA và chắc chắn không phải là JPQL.

+0

@TobiasLiefke Ông có thể vui lòng giải thích làm thế nào để sử dụng nhiều cột nối với biểu thức? – user75ponic

+0

@TobiasLiefke Tôi khuyên bạn nên xóa dấu trùng lặp khỏi câu hỏi. – user75ponic

+1

Không trùng lặp vì câu trả lời được liên kết đề cập đến JPQL chứ không phải phương pháp API tiêu chí. –

Trả lời

2

Bạn về cơ bản có thể bọc concat(...) vào nhau, hoặc sử dụng một phương pháp như sau (giả sử bạn muốn sử dụng chuỗi delimiter giống nhau giữa cột):

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

Có dấu phân tách vẫn giữ nguyên. Tôi sẽ thử phương pháp này. – user75ponic

+0

Tôi nhận được lỗi biên dịch cho 'expressions.length' – user75ponic

+1

Lỗi gì? Bạn đã quên ba dấu chấm "..."? Bạn đang sử dụng Java <1.5.x? –