Для чего нужен метод literal () CriteriaBuilder? - PullRequest
0 голосов
/ 24 декабря 2018

Документация гласит:

Создание выражения для литерала

В коде, который я вижу, используется cb.literal () :

  Expression<String> wordLiteral = cb.literal(word);
  predicates.add(cb.like(namePath, wordLiteral));

Но если здесь опустить wordLiteral и использовать вместо него word , ничего не изменится.Так для чего этот метод?

1 Ответ

0 голосов
/ 31 марта 2019

В случае like это работает, потому что у него есть перегруженная версия n, которая принимает String в качестве аргумента.

Есть несколько других методов для создания предиката, которые принимают только выражения.

Для примера возьмем длина .Существует только один, и он принимает Expression<String> в качестве аргумента.Если у нас есть сущность User с полем account и на основе пользовательского ввода мы должны найти пользователей, чья account имеет одинаковую длину, что можно сделать следующим образом:

String accountInput = "Jack";

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);

Root<User> root = cq.from(User.class);

cq.select(root)
   .where(
        cb.equal(
            cb.length(root.get("account")),
            cb.length(cb.literal(accountInput))
        )
);
...