1. 程式人生 > >org.hibernate.PropertyAccessException: IllegalArgumentException(已解決)

org.hibernate.PropertyAccessException: IllegalArgumentException(已解決)

在做課設的時候:

出現異常:org.hibernate.PropertyAccessException: IllegalArgumentException,搞了好半天。原來是Restrictions.eq()中的第二個引數出問題了,下面是另一個人寫的。和我的錯誤時一樣的

看看Exception資訊:

  1. org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.lssrc.pams.model.User.userId
  2.     ......
  3. Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
  4.     ......

我是用Criteria的方式,按使用者查詢任務資訊。下面是我的程式碼:

User.java

  1. @Entity
  2. @Table(name = "pams_user")
  3. public class User extends BasePOJO {
  4.     private static final long serialVersionUID = 1L;
  5.     private String userId;
  6.     private String userName;
  7.     // getter, setter
  8. }

Task.java

  1. @Entity
  2. @Table(name = "pams_task")
  3. public class Task extends BasePOJO {
  4.     private static final long serialVersionUID = 1L;
  5.     private String taskId;
  6.     private String taskEndTime;
  7.     private User user;
  8.     // getter, setter
  9. }

TaskDAOImpl.java

  1. @SuppressWarnings("unchecked")
  2. public List<Task> findByUser(User user, int beginIndex, int count) {
  3.     try {
  4.         session = getSessionFactory().getCurrentSession();
  5.         transaction = session.beginTransaction();
  6.         tasks = session.createCriteria(Task.class).add(Restrictions.eq("userId", user.getUserId())).list();
  7.         transaction.commit();
  8.     } catch (Exception e) {
  9.         transaction.rollback();
  10.         e.printStackTrace();
  11.         return null;
  12.     }
  13.     return tasks;
  14. }

反覆測試之後,其實是下面這句話的原因:

  1. 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()。要修改成:

  1. tasks = session.createCriteria(Task.class).add(Restrictions.eq("userId", user)).list();

修改之後,又會出現新的錯誤:

  1. 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學的還是不夠精細。做事還需謹慎認真。切記!