2012-09-25 2 views
1

이 메서드를 실행 중입니다. 나는이 프로그래밍 언어에 새로운 오전과 내가이 오류를 해결하는 방법에 대한 충분한 생각이없는하위 쿼리가 최대 절전 모드에서 둘 이상의 행을 반환합니다.

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

:

@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); 
} 

그리고이 오류를있다.

답변

1

왜 당신이 Criteria와 하위 쿼리를 사용하는지 모르겠다. 간단한 HQL 쿼리보다 읽기 쉽지 않기 때문이다. ,이 쿼리가 잘못되었다고 볼

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

그리고 실제로 : 이것은 해당 HQL 질의하는 사용자와 ID를 비교

  • 유효하지 않습니다
  • 하위 쿼리 반환 모든 사용자 참조 하나의 사용자 ID를 N 명의 사용자와 비교하는 것은 유효하지 않습니다.

쿼리가 반환해야하는 내용을 모르겠으므로 코드를 수정하기가 어렵습니다. 쿼리의 목적이 UserType이 참조하는 모든 사용자를 반환하는 것이라면이 간단한 HQL 쿼리를 사용합니다.

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

JB는 정말 감사합니다. 나는 당신이 제안한 HQL 방법을 사용할 것이다. –

관련 문제