使用 CriteriaQuery 和 EntityManager(Hibernate) 进行查询
Query with using CriteriaQuery and EntityManager(Hibernate)
如何使用 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);
您的代码看起来像是在正确的轨道上,只是它只有一个 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);
附带说明一下,在现实生活中,您通常不会将原始用户密码存储在您的数据库中。相反,您存储的是加盐和加密的密码。所以希望您的实际程序不会存储原始密码。
最终对我有用的是:
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();
如何使用 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);
您的代码看起来像是在正确的轨道上,只是它只有一个 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);
附带说明一下,在现实生活中,您通常不会将原始用户密码存储在您的数据库中。相反,您存储的是加盐和加密的密码。所以希望您的实际程序不会存储原始密码。
最终对我有用的是:
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();