JPA 表达式连接两个以上的列
JPA Expression concatenate more than two columns
我有以下语句连接两列效果很好
Expression<String> stringConcat =
cb.concat(cb.concat(root.get(Employee_.userId), " # "),
joinDept.get(Employee_.empName));
并且 SQL 是
select emp.user_id|| ' # '|| dept.emp_name from ..
我想再连接一列,SQL 是
select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..
不确定如何使用 CriteriaBuilder 和 Expression
在 JPA API 中添加其他列
编辑 1
我正在寻找使用多列的串联,而标记为重复的答案无助于解决问题,最重要的是,这个问题已被标记并正在寻求解决与 JPA 标准相关的串联问题的解决方案 API 当然不是 JPQL。
您基本上可以将 concat(...)
相互包裹起来,或者使用如下方法(假设您希望在列之间使用相同的分隔符字符串):
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);
这是 multi-concat 函数的一个比 更简单的实现。
public static Expression<String> concat(CriteriaBuilder cb, String separator,
Expression<String>... expressions) {
// Returns an empty string if no expression is provided
if (expressions.length == 0) {
return cb.literal("");
}
// Start with the first expression
Expression<String> result = expressions[0];
// Then concat subsequent expressions (starting from the second one)
for (int i = 1; i < expressions.length; i++) {
result = cb.concat(result, cb.concat(separator, expressions[i]));
}
return result;
}
好处:它 return 是一个空字符串表达式,而不是普通的 null
当在参数中没有任何表达式的情况下调用时。在那种情况下,可以说 return cb.nullLiteral(String.class)
相反。
我有以下语句连接两列效果很好
Expression<String> stringConcat =
cb.concat(cb.concat(root.get(Employee_.userId), " # "),
joinDept.get(Employee_.empName));
并且 SQL 是
select emp.user_id|| ' # '|| dept.emp_name from ..
我想再连接一列,SQL 是
select emp.user_id|| ' # '|| dept.emp_name|| ' # '|| hist.user_name from ..
不确定如何使用 CriteriaBuilder 和 Expression
在 JPA API 中添加其他列编辑 1
我正在寻找使用多列的串联,而标记为重复的答案无助于解决问题,最重要的是,这个问题已被标记并正在寻求解决与 JPA 标准相关的串联问题的解决方案 API 当然不是 JPQL。
您基本上可以将 concat(...)
相互包裹起来,或者使用如下方法(假设您希望在列之间使用相同的分隔符字符串):
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);
这是 multi-concat 函数的一个比
public static Expression<String> concat(CriteriaBuilder cb, String separator,
Expression<String>... expressions) {
// Returns an empty string if no expression is provided
if (expressions.length == 0) {
return cb.literal("");
}
// Start with the first expression
Expression<String> result = expressions[0];
// Then concat subsequent expressions (starting from the second one)
for (int i = 1; i < expressions.length; i++) {
result = cb.concat(result, cb.concat(separator, expressions[i]));
}
return result;
}
好处:它 return 是一个空字符串表达式,而不是普通的 null
当在参数中没有任何表达式的情况下调用时。在那种情况下,可以说 return cb.nullLiteral(String.class)
相反。