Hibernate 如何从doWork()方法获取返回

Hibernate 如何从doWork()方法获取返回,hibernate,Hibernate,这是我下面给出的dowork代码,我无法获取返回计数是否有任何方法可以从该方法获取返回,doreturnwork对此不起作用请帮助我,我正在尝试,但没有类似doreturnwork的方法请帮助 sessionFactory.getCurrentSession().doWork( new Work() { public void execute(Connection connection) throws S

这是我下面给出的dowork代码,我无法获取返回计数是否有任何方法可以从该方法获取返回,doreturnwork对此不起作用请帮助我,我正在尝试,但没有类似doreturnwork的方法请帮助

sessionFactory.getCurrentSession().doWork(  

            new Work()
            {   
                public void execute(Connection connection) throws SQLException   
                {
                    String contactQueryCounts = "";
                    String contactQueryIds = "";
                    int index = 1;
                    StringBuilder builder = new StringBuilder();
                    CustomerUser user = (CustomerUser) userService.getLoggedInUser();
                    String inClause = "";
                    for (Long id :ids ) {
                        builder.append("?,");
                    }
                    if(builder.length()>0){
                        inClause = builder.substring(0, builder.length()-1);
                    }

                    if(inClause.length()>0){
                        contactQueryCounts= "select count(id) from ( select *,@num := if(@company_id = company_id, @num + 1, 1) as row_number," +
                        "@company_id := company_id as dummy from salebuild_ctl.company_contact where id in ("+inClause+") " +
                        " order by company_id,  date_created asc  ) as x where x.row_number <= ?";

                        contactQueryIds= "select id from ( select *,@num := if(@company_id = company_id, @num + 1, 1) as row_number," +
                        "@company_id := company_id as dummy from salebuild_ctl.company_contact where id in ("+inClause+") " +
                        " order by company_id,  date_created asc  ) as x where x.row_number <= ?";
                    }else{
                        contactQueryCounts= "select count(id) from ( select *,@num := if(@company_id = company_id, @num + 1, 1) as row_number," +
                        "@company_id := company_id as dummy from salebuild_ctl.company_contact  " +
                        " order by company_id,  date_created asc  ) as x where x.row_number <= ?";

                        contactQueryIds= "select id from ( select *,@num := if(@company_id = company_id, @num + 1, 1) as row_number," +
                        "@company_id := company_id as dummy from salebuild_ctl.company_contact  " +
                        " order by company_id,  date_created asc  ) as x where x.row_number <= ?";
                    }

                    java.sql.PreparedStatement sCount;
                    java.sql.PreparedStatement sIds;
                    try {
                        sCount = connection.prepareStatement(contactQueryCounts);
                        sIds = connection.prepareStatement(contactQueryIds);
                        for(Long id : ids){
                            sCount.setLong(index, id);
                            sIds.setLong(index, id);
                            index=index+1;
                        }
                        sCount.setInt(index,user.getAccount().getCurrentSubscription().getNumberofcontactspercompany());
                        sIds.setInt(index,user.getAccount().getCurrentSubscription().getNumberofcontactspercompany());
                        ResultSet rs  =  sCount.executeQuery();
                        int c = rs.getInt(1);

                        String contactLevelCountsQuery="select c.name,count(a.id) from company_contact a left join  " +
                        "title b on a.corporate_title_id=b.id left join title_level c on b.title_level_id=c.id where a.id  in" +
                        " ("+sIds.toString()+") and c.name is not null group by c.name";

                        java.sql.Statement s = connection.createStatement();
                        ResultSet rsIds = s.executeQuery(contactLevelCountsQuery);

                        SearchService.levelToContactCount.clear();

                        while (rsIds.next()) {
                            if(rsIds.getString(1) == null){
                                SearchService.levelToContactCount.put("No Level",rsIds.getInt(2));
                            }else{
                                SearchService.levelToContactCount.put(rsIds.getString(1),rsIds.getInt(2));
                            }
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                    }
                }    
            }
    );

初始化空集合或持有者对象,并在工作实例中填充此集合或持有者:

public List<Foo> searchFoos() {
    final List<Foo> result = new ArrayList<Foo>();
    sessionFactory.getCurrentSession().doWork(new Work() {
        public void execute(Connection connection) throws SQLException {
            // do some work
            result.add(foo1);
            // do some work
            result.add(foo2);
        }
    });
    return result;
}

可能您想使用另一种在Hibernate中调用的方法。也许您可以从Hibernate4查看

,也可以使用session.doReturningWorkReturningWork,如下所示

ReturningWork<Long> maxReturningWork = new ReturningWork<Long>() {

                @Override
                public Long execute(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement = null;
                    ResultSet resultSet = null;
                    try {
                        preparedStatement = connection.prepareStatement("select max(salary) from employee");
                        resultSet = preparedStatement.executeQuery();
                        resultSet.next();
                        return resultSet.getLong(1);
                    }catch (SQLException e) {
                        throw e;
                    } finally {
                        if(preparedStatement != null) {
                            preparedStatement.close();
                        }
                        if(resultSet != null) {
                            resultSet.close();
                        }
                    }

                }
            };
            Long maxRecord = getSession().doReturningWork(maxReturningWork);

我在描述中提到doReturingWork在我的版本中不起作用。很好的解释
ReturningWork<Long> maxReturningWork = new ReturningWork<Long>() {

                @Override
                public Long execute(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement = null;
                    ResultSet resultSet = null;
                    try {
                        preparedStatement = connection.prepareStatement("select max(salary) from employee");
                        resultSet = preparedStatement.executeQuery();
                        resultSet.next();
                        return resultSet.getLong(1);
                    }catch (SQLException e) {
                        throw e;
                    } finally {
                        if(preparedStatement != null) {
                            preparedStatement.close();
                        }
                        if(resultSet != null) {
                            resultSet.close();
                        }
                    }

                }
            };
            Long maxRecord = getSession().doReturningWork(maxReturningWork);