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();
请注意,我有点推断,但您不应该在数据库中存储明确的密码,也不应该通过电子邮件发送密码(这本质上是不安全的)。实际上,密码恢复的常见过程是通过邮件发送具有有限生命周期的链接,允许用户输入新密码。
Update:实际上,您可能不需要在这里进行动态查询,但我将上面的内容留给参考。
要使用 Criteria API 实现 OR,您可以执行以下操作:
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
在这种情况下,选择哪种解决方案并不重要,两者都可以完成工作。