2013-02-27 4 views
6

Hier ist mein Code unten für dowork() im nicht in der Lage, Rückgabe zu erhalten Count gibt es eine Möglichkeit, die Rückkehr von dieser Methode und doreturnwork() funktioniert nicht für diese bitte helfen mich im Versuch, es aber es gibt keine Methode, wie doreturnwork helfen bitteWie bekomme ich die Rückgabe von doWork() Methode

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

Antwort

4

eine leere Sammlung oder Halter Objekt initialisieren, und füllen sie diese Sammlung oder Halter in der Work Beispiel:

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

oder noch sauberer , erstellen Sie eine benannte Unterklasse von Work:

+0

Gute Erklärung – ronan

0

Wahrscheinlich möchten Sie eine andere Methode namens doReturningWork in Hibernate verwenden. Vielleicht können Sie this blog

+0

Ich habe in der Beschreibung erwähnt, dass doReturingWork nicht in meiner Version arbeiten. – shitanshu

11

Von Hibernate4 buchen, können Sie auch session.doReturningWork (ReturningWork Arbeit) wie folgt verwenden,

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