2012-09-25 36 views
1

我正在執行此方法。子查詢返回超過1行休眠

@Override 
public Page<User> searchUsers(String name, int userTypeDefId, int accountTypeDefId, 
     final PageSetting pageSetting) { 
    HibernateCallback<Page<User>> hibernateCB = new HibernateCallback<Page<User>>() { 

     @Override 
     public Page<User> doInHibernate(Session session) throws HibernateException, 
       SQLException { 
      Criteria c = session.createCriteria(User.class); 
      DetachedCriteria dc = DetachedCriteria.forClass(UserType.class); 
      dc.setProjection(Projections.property("user")); 
      c.add(Subqueries.propertyEq(UserField.id.name(), dc)); 
      c.addOrder(Order.asc(UserField.userName.name())); 
      Page<User> ret = getAll(c, pageSetting); 
      for (User user : ret.getData()) { 
       getHibernateTemplate().initialize(user.getUserAccountTypes()); 
       getHibernateTemplate().initialize(user.getUserTypes()); 
      } 
      return ret; 
     } 
    }; 
    return getHibernateTemplate().execute(hibernateCB); 
} 

,我有此錯誤:

java.sql.SQLException: Subquery returns more than 1 row. 

我是新來這個編程語言,我沒有就如何解決這個錯誤足夠的想法。

回答

1

我不知道你爲什麼使用Criteria和子查詢,因爲它使事情的可讀性低於簡單的HQL查詢。這相當於HQL查詢:

select u from User u 
where u.id = (select userType.user from UserType userType) 
order by u.name asc 

事實上,你看到這個查詢無效:

  • 與用戶進行比較的ID無效
  • 的子查詢返回的所有用戶參考通過UserType,因此將一個用戶ID與N個用戶進行比較無效。

我不知道你的查詢應該返回什麼,所以很難修復代碼。如果查詢的目標是返回UserType所引用的所有用戶,我會使用這個簡單的HQL查詢:

select distinct user from UserType userType 
inner join userType.user user 
order by user.name 
+0

非常感謝你,先生JB。我將使用您建議的HQL方法。 –