Criteria API очень подходит для динамической генерации запросов и будет иметь мои предпочтения здесь. Вы могли бы сделать что-то вроде этого:
Criteria criteria = session.createCriteria(User.class)
.setProjection(Projections.property("password"));
if (email != null) {
criteria.add(Expression.eq("email", email));
}
if (username != null) {
criteria.add(Expression.eq("username", username));
}
String password = (String) criteria.uniqueResult();
Обратите внимание, что я немного экстраполирую, но вы не должны хранить чистые пароли в базе данных и не должны посылать пароли по электронной почте (что небезопасно по своей природе). На самом деле, обычной процедурой восстановления пароля является отправка по почте ссылки с ограниченным сроком службы, позволяющей пользователю ввести новый пароль.
Обновление : На самом деле, вам может не понадобиться динамический запрос, но я оставляю приведенное выше для справки.
Чтобы реализовать ИЛИ с Criteria API, вы можете сделать что-то вроде этого:
Criteria criteria = session.createCriteria(User.class);
Criterion username = Restrictions.eq("username", usernameOrPassword);
Criterion email = Restrictions.eq("email", usernameOrPassword);
LogicalExpression orExp = Restrictions.or(username, email);
criteria.add(orExp);
В HQL вы можете выполнить следующий запрос:
from User s
where u.username = :usernameOrPassword
or u.password = :usernameOrPassword
В этом случае не имеет значения, какое решение вы выберете, оба сделают эту работу.