В случае 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))
)
);