2013-02-27 9 views
6

ここではdowork()の返り値を得ることができません。このメソッドから戻り値を取得する方法はありますか?doreturnwork()は役に立ちません。私のうちイムそれをしようとしたがdoreturnworkのような方法がないdoWork()メソッドからの戻り値の取得方法

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

答えて

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(); 
} 
+0

に従ってください良い説明 – ronan

0

おそらく、doReturningWorkという別のメソッドをHibernateで使いたいと思うかもしれません。たぶん、あなたはHibernate4からthis blog

+0

としてsession.doReturningWork(ReturningWork作業)を使用することができます。 – shitanshu

11

を見ることができ、また、私はdoReturingWorkは私のバージョンでは動作しない説明で述べてきた、

​​
関連する問題