首页 > 解决方案 > 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();

    }

标签: hibernatejpaconcatcriteria-api

解决方案


您可以将带有@Formula注释的字段添加到实体

@Formula("concat(fam, name, otch)")
private String fullName;

其中fam, name,otch是列名。

并以这种方式使用它

Predicate predicate  = criteriaBuilder.like(teacherRoot.get("fullName"),"%" + str + "%");

推荐阅读