org.hibernate.PropertyAccessException: IllegalArgumentException(已解決)
阿新 • • 發佈:2019-02-07
在做課設的時候:
出現異常:org.hibernate.PropertyAccessException: IllegalArgumentException,搞了好半天。原來是Restrictions.eq()中的第二個引數出問題了,下面是另一個人寫的。和我的錯誤時一樣的
看看Exception資訊:
- org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.lssrc.pams.model.User.userId
- ......
- Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
- ......
我是用Criteria的方式,按使用者查詢任務資訊。下面是我的程式碼:
User.java
- @Entity
- @Table(name = "pams_user")
- public class User extends BasePOJO {
- private static final long serialVersionUID = 1L;
- private String userId;
- private String userName;
- // getter, setter
- }
Task.java
- @Entity
- @Table(name = "pams_task")
- public class Task extends BasePOJO {
- private static final long serialVersionUID = 1L;
- private String taskId;
- private String taskEndTime;
- private User user;
- // getter, setter
- }
TaskDAOImpl.java
- @SuppressWarnings("unchecked")
- public List<Task> findByUser(User user, int beginIndex, int count) {
- try {
- session = getSessionFactory().getCurrentSession();
- transaction = session.beginTransaction();
- tasks = session.createCriteria(Task.class).add(Restrictions.eq("userId", user.getUserId())).list();
- transaction.commit();
- } catch (Exception e) {
- transaction.rollback();
- e.printStackTrace();
- return null;
- }
- return tasks;
- }
反覆測試之後,其實是下面這句話的原因:
- tasks = session.createCriteria(Task.class).add(Restrictions.eq("userId", user.getUserId())).list();
原因在於Restrictions.eq("userId", user.getUserId())這個方法中,匹配的並不是像sql寫的那樣,某個欄位等於某個值,在這裡,而是要看Task.java中user物件的型別。因為在Task.java中user是User型別的,所以,這個地方並不需要getUserId()。要修改成:
- tasks = session.createCriteria(Task.class).add(Restrictions.eq("userId", user)).list();
修改之後,又會出現新的錯誤:
- org.hibernate.QueryException: could not resolve property: userId of: com.lssrc.pams.model.Task
這個問題,還是Restrictions.eq("userId", user)的問題,userId,應該改成user。因為在Task.java中,User物件的名字是user。再測試時,終於通過了。。。
Hibernate學的還是不夠精細。做事還需謹慎認真。切記!