休眠查询语言或使用条件?
Posted
技术标签:
【中文标题】休眠查询语言或使用条件?【英文标题】:hibernate query language or using criteria? 【发布时间】:2011-02-23 17:15:00 【问题描述】:任何告诉我使用条件/hql/sql 查询的人。 要求是用户输入电子邮件或用户名查询返回密码 表用户中的用户。
【问题讨论】:
我认为这与 javascript 无关。 我是新来的,因此不知道它是如何从休眠中基本标记出来的。 【参考方案1】: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
在这种情况下,您选择哪种解决方案都没有关系,两者都能胜任。
【讨论】:
if(email==null) criteria.add(Expression.isNull("email"))
等等?
@Alison:嗯……什么?我在回答中的意思是:“如果电子邮件参数不为空,则将其添加到 where 子句中。用户名也是如此”。这与你写的非常不同,这不是 OP 想要的 IMO。
public RegularUser findByUserNameOrEmailId(String userNameOrEmailId) List如果您所做的只是获取一个字段,那么您可能只想使用 hql(或者可能是 sql)。
如果你做标准,我相信你会拉回整个对象,只是为了最终使用一个字段。
编辑: 这是一个非常广泛的问题。 这是tutorial
【讨论】:
是的,我想使用电子邮件或用户名中的一个字段拉回整个对象。但我不知道怎么做?????? 我编辑包含一个教程...询问如何做 nhibernate 在这里可能有点超出范围。如果您有具体问题,可以更轻松地解决这些问题。 这是我希望用户输入电子邮件或用户名的查询,查询返回用户......现在问题是我放置或条件的 OR 条件......以上是关于休眠查询语言或使用条件?的主要内容,如果未能解决你的问题,请参考以下文章