hibernate - Criteria API concat 3 字段值
问题描述
如何串联3个字段?我想通过输入字符串进行搜索。像这样的表达
%firstName%LastName%Patr%
可能有不同的订单 %LastName%Patr%firstName% 等
我怎样才能做到这一点?
我的代码只搜索一个字段,但我同时需要 3 个
@Override
public List<Teacher> searchByString(String str) {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Teacher> criteriaQuery = criteriaBuilder.createQuery(Teacher.class);
Root<Teacher> teacherRoot = criteriaQuery.from(Teacher.class);
Expression concatForOtch = criteriaBuilder.concat(teacherRoot.get("otch"),"%");
Expression concatForName = criteriaBuilder.concat(teacherRoot.get("name"),"%");
Expression concatForFam = criteriaBuilder.concat(teacherRoot.get("fam"),"%");
Expression almostFinalExpression = criteriaBuilder.concat(concatForName,concatForOtch);
Expression finalExpression = criteriaBuilder.concat(concatForFam,almostFinalExpression);
Expression fullExpression = criteriaBuilder.concat("%", finalExpression);
Predicate pr = criteriaBuilder.like(fullExpression,"%" + str + "%");
criteriaQuery.where(pr);
return em.createQuery(criteriaQuery).getResultList();
}
解决方案
您可以将带有@Formula注释的字段添加到实体
@Formula("concat(fam, name, otch)")
private String fullName;
其中fam
, name
,otch
是列名。
并以这种方式使用它
Predicate predicate = criteriaBuilder.like(teacherRoot.get("fullName"),"%" + str + "%");
推荐阅读
- c++ - int* a 和 int* a =new int 的区别
- php - 如何在不提取的情况下在php中打开文件系统映像
- css - 忽略模态中的 CSS
- javascript - 语义 UI 搜索表单未获取对象数据
- linux - 端口 8080 上的 Nginx HTTPS
- c - C结构初始化
- angular - 延迟加载 Angular 与传统 MPA 有什么区别?
- visual-studio-2019 - 我无法在 CefSharp (ChromiumBrowser) 中观看 youtube 直播
- bash - 终端被 vscode 永久修改
- python - 我将如何更改 Alex 网络的 input_shape(使用 tf-keras)?