休眠查询语言或使用条件?

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 list=super.findByCriteria(Restrictions.eq("username",userNameOrEmailId), Restrictions.eq("password", userNameOrEmailId));返回 list.size()>0 ? list.get(0) : null; 用户只给出一个参数 我希望用户名和电子邮件之间的条件满足查询返回常规用户【参考方案2】:

如果您所做的只是获取一个字段,那么您可能只想使用 hql(或者可能是 sql)。

如果你做标准,我相信你会拉回整个对象,只是为了最终使用一个字段。

编辑: 这是一个非常广泛的问题。 这是tutorial

【讨论】:

是的,我想使用电子邮件或用户名中的一个字段拉回整个对象。但我不知道怎么做?????? 我编辑包含一个教程...询问如何做 nhibernate 在这里可能有点超出范围。如果您有具体问题,可以更轻松地解决这些问题。 这是我希望用户输入电子邮件或用户名的查询,查询返回用户......现在问题是我放置或条件的 OR 条件......

以上是关于休眠查询语言或使用条件?的主要内容,如果未能解决你的问题,请参考以下文章

我可以对未映射到表的实体使用休眠查询语言吗?

一对多和一对多连续映射的休眠条件查询 - 表或视图不存在

休眠查询(不是 SQL)日志记录

MySQLDQL语言——条件查询

休眠条件查询到 JPA 条件查询

HQL 或 Java 持久性查询语言中的 IN 子句