hibernate查询语言还是使用标准?

时间:2010-05-25 13:55:21

标签: java hibernate orm hql criteria

任何使用criteria / hql / sql告诉我查询的人。 要求是用户输入电子邮件或用户名查询返回的密码 表用户的用户。

2 个答案:

答案 0 :(得分:3)

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实现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

在这种情况下,选择哪种解决方案并不重要,两者都可以完成任务。

答案 1 :(得分:1)

如果你所做的只是获取一个字段,你可能只想要去hql(或者可能是sql)。

如果你做标准,我相信你会拉回整个物体,只是为了最终使用一个场地。

修改 这是一个非常广泛的问题。 这是tutorial