Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA表达式连接两个以上的列_Jpa_Eclipselink_Jpa 2.0_Criteria_Criteria Api - Fatal编程技术网

JPA表达式连接两个以上的列

JPA表达式连接两个以上的列,jpa,eclipselink,jpa-2.0,criteria,criteria-api,Jpa,Eclipselink,Jpa 2.0,Criteria,Criteria Api,我用下面的语句连接两列,效果很好 Expression<String> stringConcat = cb.concat(cb.concat(root.get(Employee_.userId), " # "), joinDept.get(Employee_.empName)); select emp.user_id|| ' # '|| dept.emp_name|| ' # '||

我用下面的语句连接两列,效果很好

Expression<String> stringConcat = 
            cb.concat(cb.concat(root.get(Employee_.userId), " # "), 
                                   joinDept.get(Employee_.empName));
select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..       
我想再连接一列,SQL是

select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..       
不确定如何使用CriteriaBuilder和表达式在JPA API中添加其他列

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

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

我正在寻找使用多列的连接,而标记为重复的答案无助于解决问题,最重要的是,此问题已标记,并寻求解决连接问题的解决方案涉及JPA标准API,当然不涉及JPQL。

您基本上可以包装
concat(…)
相互转换,或使用如下方法(假设要在列之间使用相同的分隔符字符串):

select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..       
private-CriteriaBuilder-CriteriaBuilder=/**/
//注意“表达式”前的三个点,它们不是装饰;-)
专用表达式concat(字符串分隔符、表达式…表达式){
表达式结果=null;
for(int i=0;i
这里是一个比提供的更简单的多concat函数实现

select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..       
公共静态表达式concat(CriteriaBuilder cb,字符串分隔符,
表达……表达){
//如果未提供表达式,则返回空字符串
if(expressions.length==0){
返回cb.literal(“”);
}
//从第一个表达式开始
表达式结果=表达式[0];
//然后连接后续表达式(从第二个表达式开始)
for(int i=1;i

好处:当在参数中没有任何表达式的情况下调用时,它返回一个空字符串表达式,而不是纯
null
。在这种情况下,它可能返回
cb.nullLiteral(String.class)

@tobisliefke您能解释一下如何使用表达式的多列串联吗?@tobisliefke我建议请删除问题中的重复标记。不是重复,因为链接答案引用的是JPQL,而不是标准API方法。所以“是”分隔符保持不变。我将尝试这种方法。我得到
表达式的编译错误。长度
什么错误?你忘了这三个点了吗?您是否使用Java<1.5.x?非常好,这解决了问题。非常感谢。事实上,他们没有为concat自己编写这个功能,concat是一个可以拥有所需参数的函数,这是非常可悲的。
select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..