繁体   English   中英

状态字段路径无法解析为有效类型

[英]The state field path cannot be resolved to a valid type

首先,我已经研究了这个问题,但是我仍然不知道为什么它对我不起作用。

我正在用Java开发一个动态Web应用程序,该应用程序使用JPA来存储用户的登录信息。 我可以轻松插入新用户或从表中列出所有用户。 但是,我正在尝试编写一种登录方法来对用户进行身份验证,在该方法中,我只想选择具有给定用户名和密码的用户。

这是我的DaoImpl类中的方法:

public User login(String userName, String passWord) {
    String sqlCommand = String.format("select u from users u where u.uname = '%s' and u.password = '%s'", userName, passWord);
    Query q = this.getEntityManager().createQuery(sqlCommand);
    //q.setParameter("uname", userName);
    //q.setParameter("pass", passWord);

    try{
        return (User) q.getSingleResult();
    } catch(Exception e) {
        return null;
    }
}

这是实体类:

@Entity(name=User.TABLE_NAME)
@Table(name=User.TABLE_NAME, schema=PersistentObject.SCHEMA)
public class User extends PersistentObject{

public static final String TABLE_NAME ="users";

public static final String FIRST_NAME ="fname";
public static final String LAST_NAME = "lname";
public static final String USERNAME ="uname";
public static final String EMAIL = "email";
public static final String PASSWORD = "password";

@Column(name=FIRST_NAME, nullable=false)
private String firstName;

@Column(name=LAST_NAME, nullable=false)
private String lastName;

@Column(name=USERNAME, nullable=false, unique=true)
private String userName;

@Column(name=EMAIL, nullable=false, unique=true)
private String email;

@Column(name=PASSWORD, nullable=false)
private String passWord;

@OneToMany(mappedBy="user")
private List<Update> updateList;

@OneToMany(mappedBy="user1")
private List<Friend> friendList;

public User() {
}

public User(String firstName, String lastName, String userName,
        String email, String passWord) {
    super();
    this.firstName = firstName;
    this.lastName = lastName;
    this.userName = userName;
    this.email = email;
    this.passWord = passWord;
}

在我的Servlet中,我试图像这样调用DaoImpl类的login()方法:

User loggedInuser = this.userDao.login(request.getParameter("uname"),   request.getParameter("pass"));

这是我在同一行得到的错误:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: <|Exception Description: Problem compiling [select u from users u where u.uname = 'something' and u.password = '12345']. |[28, 35] The state field path 'u.uname' cannot be resolved to a valid type.|[57, 67] The state field path 'u.password' cannot be resolved to a valid type.

奇怪的是,如果我尝试过滤id或email列,则不会出现此错误。 登录成功。 但是对于其他所有列,我都会遇到上述错误。

您正在执行的查询不是SQL查询。 这是一个JPQL查询。 JPQL是另一种语言。 特别是,它从不使用表名和列名。 它始终使用实体名称及其映射的字段/属性名称。

所以查询应该是

select u from User u where u.userName = :name and u.passWord = :password

请注意,除了由于使用String.format()而不是命名参数而导致的注入攻击之外,一旦用户名或密码包含单引号,您的查询也将不起作用。 将明文密码存储在数据库中也不是一个好主意。 他们应该加盐和散列。

首先,将%s占位符替换为实际的用户名和密码,然后尝试调用setParameter(),但它不存在。 查询中的参数以冒号开头。 这是正确的代码:

String sqlCommand = "select u from User u where u.userName = :uname and u.password = :pass";
Query q = this.getEntityManager().createQuery(sqlCommand);
q.setParameter("uname", userName);
q.setParameter("pass", passWord);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM