Java 使用Hibernate,如何检查试图登录的用户在数据库中是否有注册帐户?
我不熟悉Hibernate和Servlets,我正在做一个非常小的项目,用户可以在酒店预订房间 我能够成功注册/创建帐户,但无法登录 我曾尝试在DAO类中使用Criteria查询,但由于java.lang.ClassCastException而失败 jsp页面中的用户名和密码被发送到登录servlet,在那里创建一个新的DAO对象,并将提取的用户名和密码传递给它的方法 DAO使用条件查询检查用户是否存在于数据库中并返回布尔值,登录servlet检查返回的布尔值并重定向是否为真 登录Servlet: DAO类:Java 使用Hibernate,如何检查试图登录的用户在数据库中是否有注册帐户?,java,hibernate,servlets,login,dao,Java,Hibernate,Servlets,Login,Dao,我不熟悉Hibernate和Servlets,我正在做一个非常小的项目,用户可以在酒店预订房间 我能够成功注册/创建帐户,但无法登录 我曾尝试在DAO类中使用Criteria查询,但由于java.lang.ClassCastException而失败 jsp页面中的用户名和密码被发送到登录servlet,在那里创建一个新的DAO对象,并将提取的用户名和密码传递给它的方法 DAO使用条件查询检查用户是否存在于数据库中并返回布尔值,登录servlet检查返回的布尔值并重定向是否为真 登录Servlet
public boolean checkUserLogin(字符串uname,字符串pass)
{
布尔登录=false;
试一试{
Configuration cfg=new Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf=cfg.buildSessionFactory();
Session Session=sf.openSession();
事务tr=session.beginTransaction();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(字符串[].class);
Root=criteriaquery.from(User.class);
Path usernamePath=root.get(“用户名”);
Path passwordPath=root.get(“密码”);
multiselect(usernamePath,passwordPath);
Query Query=session.createQuery(criteriaquery);
List=query.List();
对于(字符串[]s:list)
{
如果(s[0].equals(uname)和&s[1].equals(pass))
{
login=true;
}
其他的
{
登录=假;
}
}
tr.commit();
}捕获(休眠异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回登录;
}
当我尝试登录时,web浏览器重定向到登录servlet,并以java.lang.ClassCastException停止。大多数在线教程都使用jdbc而不是Hibernate。有没有一种简单的方法来实现Hibernate登录?我已经研究了这个问题,它似乎没有从
query.list()
返回String[]
中的数据,尽管根据API文档它应该这样做
备选方案
您也可以使用元组
类或对象[]
元组
query.list()
而是query.getSingleResult()
可以使用public boolean checkUserLogin(String uname, String pass) {
boolean login = false;
try {
Configuration cfg = new
Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction tr = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaquery = builder.createQuery(Tuple.class);
Root<User> root = criteriaquery.from(User.class);
Path<String> usernamePath = root.get("username");
Path<String> passwordPath = root.get("password");
criteriaquery.multiselect(usernamePath, passwordPath);
criteriaquery.where(builder.equal(root.get("username"), uname), builder.equal(root.get("password"), pass));
Query<Tuple> query = session.createQuery(criteriaquery);
Tuple _userRec = query.getSingleResult();
System.out.println("user -> " + _userRec.get(0, String.class) + ", pass -> " + _userRec.get(1, String.class));
if (_userRec != null) {
login = true;
}
tr.commit();
} catch (HibernateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return login;
}
public boolean checkUserLogin(字符串uname,字符串pass){
布尔登录=false;
试一试{
配置cfg=新
Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf=cfg.buildSessionFactory();
Session Session=sf.openSession();
事务tr=session.beginTransaction();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(Tuple.class);
Root=criteriaquery.from(User.class);
Path usernamePath=root.get(“用户名”);
Path passwordPath=root.get(“密码”);
multiselect(usernamePath,passwordPath);
其中(builder.equal(root.get(“用户名”),uname),builder.equal(root.get(“密码”),pass));
Query Query=session.createQuery(criteriaquery);
Tuple _userRec=query.getSingleResult();
System.out.println(“user->”+_userRec.get(0,String.class)+”,pass->“+_userRec.get(1,String.class));
如果(_userRec!=null){
login=true;
}
tr.commit();
}捕获(休眠异常e){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
返回登录;
}
不要抓住冬眠的例外。捕获它只会在代码中隐藏一个bug。如果您的问题是关于异常的,那么发布它的准确和完整的堆栈跟踪。它包含我们需要知道的内容,以便理解抛出的原因和位置。请注意,每次收到请求时都构建一个新的会话工厂并不是您应该做的事情。这需要大量的时间和资源。这件事必须做一次,而且只能做一次。我真的建议您阅读Hibernate用户指南。尽管您的查询是完全静态的,但使用条件查询也是过分的。使用JPQL。并且不要从数据库中加载所有用户来查找具有给定用户名的用户。使用查询查找具有该用户名的用户。
public boolean checkUserLogin(String uname,String pass)
{
boolean login=false;
try {
Configuration cfg = new Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction tr = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<String[]> criteriaquery = builder.createQuery(String[].class);
Root<User> root = criteriaquery.from(User.class);
Path<String> usernamePath = root.get("userName");
Path<String> passwordPath = root.get("password");
criteriaquery.multiselect(usernamePath,passwordPath);
Query<String[]> query = session.createQuery(criteriaquery);
List<String[]> list = query.list();
for(String[] s:list)
{
if(s[0].equals(uname) && s[1].equals(pass))
{
login=true;
}
else
{
login=false;
}
}
tr.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return login;
}
public boolean checkUserLogin(String uname, String pass) {
boolean login = false;
try {
Configuration cfg = new
Configuration().configure().addAnnotatedClass(User.class);
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction tr = session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaquery = builder.createQuery(Tuple.class);
Root<User> root = criteriaquery.from(User.class);
Path<String> usernamePath = root.get("username");
Path<String> passwordPath = root.get("password");
criteriaquery.multiselect(usernamePath, passwordPath);
criteriaquery.where(builder.equal(root.get("username"), uname), builder.equal(root.get("password"), pass));
Query<Tuple> query = session.createQuery(criteriaquery);
Tuple _userRec = query.getSingleResult();
System.out.println("user -> " + _userRec.get(0, String.class) + ", pass -> " + _userRec.get(1, String.class));
if (_userRec != null) {
login = true;
}
tr.commit();
} catch (HibernateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return login;
}