簡體   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