2017-04-27 68 views
2

我有一個使用SimpleJdbcCall調用Postgres的功能的道:春:SimpleJdbcCall時動態參數

public final class AuthDAO extends UntypedActor { 

    private final ActorRef manager; 

    private final JdbcTemplate jdbcTemplate; 

    private final SimpleJdbcCall jdbcCall; 

    public AuthDAO(ActorRef manager) { 
     this.manager = manager; 
     jdbcTemplate = DBConfig.jdbcTemplate(); 
     jdbcCall = new SimpleJdbcCall(jdbcTemplate) 
       .withSchemaName("auth") 
       .withCatalogName("public") 
       .withoutProcedureColumnMetaDataAccess(); 
    } 

    public static Props create(ActorRef manager) { 
     return Props.create(AuthDAO.class, manager); 
    } 

    @Override 
    public void onReceive(Object o) throws Throwable { 
     if (o instanceof DBMessage) { 

      DBMessage message = (DBMessage) o; 
      jdbcCall.declareParameters(new SqlParameter("login", Types.VARCHAR)); 
      Map<String, Object> response = jdbcCall 
        .withProcedureName(message.getProcedure()) 
        .execute(message.getParams()); 

      System.out.println(response.toString()); 
     } 
    } 
} 

但現在我必須通過調用函數中的參數來顯式聲明jdbcCall.declareParameters()否則代碼將無法正常工作。

那麼有沒有辦法動態檢測函數參數的名稱和類型,並使用這種dao來調用不同的函數只傳遞函數名?

回答

1

I figured it out

如果您使用的數據庫不是 Spring支持的數據庫,則需要顯式聲明。目前Spring支持針對以下數據庫的存儲過程調用的元數據查詢 :Apache Derby, DB2,MySQL,Microsoft SQL Server,Oracle和Sybase。我們還支持 對MySQL,Microsoft SQL Server, 和Oracle的存儲函數的元數據查找。

而且,omg,我使用Postgres。