我需要有关 Java 中的简单 servlet 的帮助。 我有一个 HTML 文件中的登录表单(电子邮件和密码字段)、一个 Java servlet 和一个用于登录的实用程序,检查数据库中是否存在具有相同电子邮件和密码的一对。 运行程序时,我的查询出现语法错误,该错误显示“用户未映射”。 我认为这是一个虚拟错误,有人可以帮助我吗?
这里是 model.User 类
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table( name = "USERS",
uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id", nullable=false, unique=true)
private int id;
@Column(name="firstName", length=40, nullable=false)
private String firstName;
@Column(name="lastname", length=40, nullable=false)
private String lastName;
@Column(name="email", length=40, nullable=false)
private String email;
@Column(name="password", length=40, nullable=false)
private String password;
public User(String firstName, String lastName, String email, String password){
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
}
public int getId(){
return this.id;
}
public void setId(int id){
this.id = id;
}
public String getFirstName(){
return this.firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName(){
return this.lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public String getEmail(){
return this.email;
}
public void setEmail(String email){
this.email = email;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password;
}
}
这里是 utility.LoginDao 类
public static boolean validateCredentials(String email, String password){
Session session = DbService.getSession();
session.beginTransaction();
Query query = session.createQuery
("from Users u where u.email=:email and u.password=:password");
query.setParameter("email", email);
query.setParameter("password", password);
List list=query.list();
...
这是我的 LoginServlet doPost() 方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String email = request.getParameter("email");
String password = request.getParameter("password");
if(LoginDao.validateCredentials(email, password)){
RequestDispatcher view = request.getRequestDispatcher("SigninSuccess.jsp");
view.forward(request, response);
}
else{
RequestDispatcher rd=request.getRequestDispatcher("index.html");
rd.include(request,response);
}
}
此处为signin.html表单文件
<form method="POST" action="LoginServlet">
<p>
<label for="fname">E-mail</label>
<input type="text" name="email" placeholder="e-mail">
</p>
<p>
<label for="lname">Password</label>
<input type="password" name="password" placeholder="password">
</p>
<input type="submit" value="Login">
<p class="message">Not registered? <a href="./signup.html">Create an account</a></p>
</form>
这是错误:
用户未映射[来自用户 u,其中 u.email=:email 和 p.password=:password] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133) 在org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) ...
最佳答案
此处您将使用数据库中的表名称(用户)创建查询
-
Query query = session.createQuery
("from Users u where u.email=:email and u.password=:password");
这就是您收到错误的原因。您需要使用实体名称 - User
-
Query query = session.createQuery
("from User u where u.email=:email and u.password=:password");
HQL 期望您使用 java 类名和 java 属性名。您还必须注意您使用的是 javax.persistence.Entity
而不是 org.hibernate.annotations.Entity
关于java - 表未映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57441188/