2015-11-25 28 views
6

olduğunuJPA İfade SQL ikiden fazla sütun

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

iyi çalışıyor ki iki sütun bitiştirmek için aşağıdaki deyimi var ve SQL ben Bir sütunu daha bitiştirmek istiyorum

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

ve bitiştirmek

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

CriteriaBuilder ve Expr kullanarak JPA API'daki diğer sütunları nasıl ekleyeceğinden emin değilsiniz. Ession

düzenleme 1

Ben birleştirme sorunu çözmek için çözüm sorunu çözmek için yardımcı olmuyor aynısı olarak işaretlenmiş birden çok sütun ve cevap kullanarak ve en önemlisi bu soru etiketlenen ve arayan birleştirme arıyorum JPA Kriteri API'sine ve kesinlikle JPQL'ye ait değildir.

+0

@TobiasLiefke sen nasıl kullanılacağını açıklar mısınız İfadeyle çoklu sütun birleştirme? – user75ponic

+0

@TobiasLiefke Lütfen öneriyi kopyalamanızı öneriyorum. – user75ponic

+1

Bağlantılı yanıt, JPrit'e başvurduğundan ve Ölçüt API'sı yaklaşımından değil, yinelenmez. –

cevap

2

Temelde birbirine concat(...) kaydırmak veya (eğer sütun arasında aynı ayırıcı dizenin kullanmak istiyorum varsayarak) aşağıdaki gibi bir yöntemi kullanabilirsiniz:

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

Evet sınırlayıcı aynı kalır. Bu yaklaşımı deneyeceğim. – user75ponic

+0

'expressionions.length' için derleme hatası alıyorum – user75ponic

+1

Hangi hata? Üç noktayı unuttun mu "..."? Java <1.5.x kullanıyor musunuz? –