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.

私はこのプログラミング言語に不慣れで、このエラーを解決する方法について十分な考えがありません。

4

1 に答える 1

1

単純な HQL クエリよりも読みにくくなるため、なぜ Criteria とサブクエリを使用しているのかわかりません。これは同等の HQL クエリです。

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

実際、このクエリは無効であることがわかります。

  • ID とユーザーの比較は無効です
  • サブクエリは、UserType によってすべてのユーザー参照を返すため、1 つのユーザー ID と N 人のユーザーを比較することは無効です。

クエリが何を返すべきかわからないため、コードを修正するのは困難です。クエリの目的が UserType によって参照されるすべてのユーザーを返すことである場合、次の単純な HQL クエリを使用します。

select distinct user from UserType userType 
inner join userType.user user
order by user.name
于 2012-09-25T09:37:33.850 に答える