HQL查询不会与uniqueResult()一起飞行

时间:2011-12-10 02:14:17

标签: hibernate hql

您好我正在尝试通过密码哈希和用户名组合从数据库中检索一个简单的对象....

username = request.getParameter("username");
password = request.getParameter("password");

// Converting request password to hash
String passwordHash = SecurityUtil.convertStringToSHA1(password);


Session hs = HibernateUtil.getSessionFactory().getCurrentSession();
hs.beginTransaction();

//query for a single result of matching username with password
//Query hquery = hs.createQuery("from User where id = :id");
//hquery.setParameter("id", 33l);  <- THIS QUERY WORKS

Query hquery = hs.createQuery("from User where password = :password and userName = :userName"); //<- password is a sha1 hash in the db
hquery.setString("userName", username);
hquery.setParameter("password", passwordHash);

User user = (User)hquery.uniqueResult(); //<- Always NULL WHY There should be a unique result.
log.info("UR: "+username);
log.info("PR: "+passwordHash);

if(user!=null) {
    //never reached
    log.info("UDB: "+user.getUserName());
    log.info("PDB: "+user.getPassword());

} else {
    always reaches here
}

任何想法?或者这是否意味着没有uniqueResults?

我的sha1哈希没有被腌制,但是密码哈希是使用apache commons从随机字符串生成的,它应该或多或少没有碰撞......

此外,这是我第一次做hibernate的东西,所以我可能在某个地方出错......

2 个答案:

答案 0 :(得分:1)

如果您获得null,则表示未找到匹配的记录。

您的密码散列可能存在问题。您可以从数据库中获取密码值 - 用于评估和测试hibernate查询的硬编码。如果可行,您可以检查输入密码不同的原因。

您还可以记录散列密码并检查它是否与db中的值匹配。还要检查用户名 - 区分大小写,领导/培训空间等。

答案 1 :(得分:0)

好的,我现在知道所有人都在流失的地方。我在这些字段上启用了jaspy字符串加密。由于随机盐很明显,WHERE子句中的这些字段不会飞......: - /