gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:14:18 25 4
gpt4 key购买 nike

首先,我研究了这个问题,但我仍然不明白为什么它对我不起作用。

我正在用 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 中,我尝试调用 login()我的方法DaoImpl像这样的类:

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 或电子邮件列,我不会收到此错误。然后就登录成功了。但对于其他所有列,我都会收到上述错误。

最佳答案

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

所以查询应该是

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

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

关于java - 状态字段路径无法解析为有效类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30605176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com