java - 表未映射

标签 java hibernate jpa servlets hql

我需要有关 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/

相关文章:

java - 无法创建具有特定类的 JAXB 实例

Spring JPA/HIbernate 在应用程序启动时创建/更新 View

java - 在 JPA 中使用带有串联 id 的字符串列值作为外键

java - 无法映射具有多对多关系的不同实体的字段

java - 访问下拉列表 - selenium webdriver 和 java

java - 如何在按钮的 onclicklistener 方法中使用 for 循环迭代变量

java - 我们可以在重写的方法中抛出新的/更广泛的异常吗?解释下面给出的代码

java - 使用 Spring 和 Hibernate 的嵌套事务

java - JPA/hibernate : mapping a single element in an entity with an one-to-many relationship

java - 我可以在 application.yml 中为实体写入表名吗?