使用CriteriaQuery和EntityManager进行查询(Hibernate)
如何使用CriteriaQuery和EntityManager为此SQL查询创建查询:使用CriteriaQuery和EntityManager进行查询(Hibernate),hibernate,jpa,entitymanager,Hibernate,Jpa,Entitymanager,如何使用CriteriaQuery和EntityManager为此SQL查询创建查询: SELECT * FROM user WHERE user.login = '?' and user.password = '?' 我尝试这样做: final CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); final CriteriaQuery<User> c
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);
final CriteriaBuilder CriteriaBuilder=getEntityManager().getCriteriaBuilder();
final-CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(User.class);
Root=criteriaQuery.from(User.class);
criteriaQuery.select(root);
其中(criteriaBuilder.gt(root.get(“login”),userLogin));
返回getEntityManager().createQuery(criteriaQuery).getResultList().get(0);
您的代码看起来好像在正确的轨道上,只是它只有一个WHERE
条件,这与原始SQL查询不一致,原始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);
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery q=cb.createQuery(User.class);
根c=q.from(User.class);
q、 选择(c);
ParameterExpression p1=cb.parameter(String.class);
ParameterExpression p2=cb.parameter(String.class);
q、 在哪里(
cb.equal(c.get(“登录”),p1),
cb.equal(c.get(“密码”),p2)
);
返回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();
entityManager.getTransaction().begin();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery();
Root-fromRoot=criteriaQuery.from(Profile.class);
criteriaQuery.select(fromRoot);
其中(criteriaBuilder.equal(fromRoot.get(“用户名”),userName),
equal(fromRoot.get(“password”)、password);
List resultList=entityManager.createQuery(criteriaQuery).getResultList();
Profile dbProfile=null;
if(resultList.isEmpty()){
//处理错误
}否则{
dbProfile=(Profile)resultList.get(0);
}
entityManager.getTransaction().commit();
非常感谢