Критерии API соответствуют 3 значениям полей - PullRequest
0 голосов
/ 22 октября 2019

Как сделать объединение 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();

    }

1 Ответ

1 голос
/ 22 октября 2019

Вы можете добавить поле, помеченное @ Formula , к сущности

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

, где fam, name, otch - имена столбцов.

И используйте это таким образом

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