子查询在hibernate中返回多行

时间:2012-09-25 01:41:30

标签: hibernate

我正在执行此方法。

@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 个答案:

答案 0 :(得分: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
相关问题