如何从doWork()方法返回

时间:2013-02-27 12:44:42

标签: hibernate

这里是我的下面给出的代码为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();
                    }
                }    
            }
    );

3 个答案:

答案 0 :(得分:11)

从Hibernate4,你也可以使用session.doReturningWork(ReturningWork工作),如下所示,

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

答案 1 :(得分:4)

初始化一个空的集合或持有者对象,并在Work实例中填充此集合或持有者:

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

甚至更干净,创建一个名为Work的子类:

private static class FooWork implements Work {
    private Foo result;

    public void execute(Connection connection) throws SQLException {
        // do some work
        result = new Foo(...);
    }

    public Foo getResult() {
        return result;
    }
}

public Foo searchFoo() {
    FooWork fooWork = new FooWork();        
    sessionFactory.getCurrentSession().doWork(fooWork);
    return fooWork.getResult();
}

答案 2 :(得分:0)

可能你想在Hibernate中使用另一个名为doReturningWork的方法。也许你可以看看this blog