使用CriteriaQuery和EntityManager(Hibernate)进行查询

3
使用CriteriaQuery和EntityManager创建查询,以便针对此SQL查询执行操作:
SELECT * FROM user WHERE user.login = '?' and user.password = '?' 

我尝试这样做:

        final CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
        final CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
        Root<User> root = criteriaQuery.from(User.class);
        criteriaQuery.select(root);
        criteriaQuery.where(criteriaBuilder.gt(root.get("login"), userLogin));
        return getEntityManager().createQuery(criteriaQuery).getResultList().get(0);
2个回答

1

您的代码看起来走在了正确的轨道上,但是它只有一个WHERE条件,这与您的原始SQL查询不符,原始查询有两个条件。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> q = cb.createQuery(User.class);
Root<User> c = q.from(User.class);
q.select(c);
ParameterExpression<String> p1 = cb.parameter(String.class);
ParameterExpression<String> p2 = cb.parameter(String.class);
q.where(
    cb.equal(c.get("login"), p1),
    cb.equal(c.get("password"), p2)
);
return em.createQuery(q).getResultList().get(0);

作为一种副产品,实际上你通常不会在数据库中存储原始的用户密码。相反,你会存储一个加盐和加密的密码。因此希望你的实际程序不会存储原始密码。

0
最终对我有用的是这个:
    entityManager.getTransaction().begin();

    CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
    Root<Profile> fromRoot = criteriaQuery.from(Profile.class);
    criteriaQuery.select(fromRoot);

    criteriaQuery.where(criteriaBuilder.equal(fromRoot.get("userName"), username),
                        criteriaBuilder.equal(fromRoot.get("password"), password));

    List<Object> resultList = entityManager.createQuery(criteriaQuery).getResultList();
    Profile dbProfile = null;
    if (resultList.isEmpty()) {
        // Handle Error
    } else {
        dbProfile = (Profile) resultList.get(0);
    }

    entityManager.getTransaction().commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接