Спящий язык запросов или использование критериев? - PullRequest
2 голосов
/ 25 мая 2010

Любой, кто скажет мне запрос, используя критерии / hql / sql. Требование заключается в том, что пользователь вводит адрес электронной почты или имя пользователя, запрос возвращает пароль пользователь из таблицы user.

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

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

В этом случае не имеет значения, какое решение вы выберете, оба сделают эту работу.

1 голос
/ 25 мая 2010

Если все, что вы делаете - это извлекаете одно поле, вы, вероятно, просто хотите перейти к hql (или, возможно, sql).

Если вы выполняете критерии, я полагаю, что вы оттягиваете весь объект, просто чтобы в конечном итоге использовать одно поле.

Edit: Это действительно широкий вопрос. Вот учебник

...