[英]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.