2017-10-21 40 views
0

我有一個帶有2個數據庫連接的DropWizard項目:一個MySql和一個Oracle(v11)。 MySql連接和查詢工作得很好。我沒有從我的Oracle查詢中獲取任何數據,並且我的日誌中沒有錯誤。使用DropWizard中的JDBI進行簡單的Oracle查詢不會執行/返回結果

我DOA看起來是這樣的:

public interface DummyDao { 

    @SqlQuery(
      "select prod_sku, initial_qty, current_qty" + 
      " from prod_detail" + 
      " where prod_sku = :skuNumber") 
    @Mapper(DummyMapper.class) 
    Dummy getSku(@Bind("skuNumber") String skuNumber); 

} 

我的映射器看起來是這樣的。當我向映射器添加日誌語句時,我能夠驗證它從未被調用過。

public class DummyMapper implements ResultSetMapper<Dummy> { 

    public Dummy map(int index, ResultSet r, StatementContext ctx) 
      throws SQLException { 

     return new Dummy(
      r.getString("prod_sku"), 
      r.getLong("initial_qty"), 
      r.getLong("current_qty")); 

    } 

} 

的DAO正在我的應用程序的運行方法,通過下面的代碼初始化:

public class ProductServiceApplication extends Application<ProductServiceConfiguration> { 

    DataSource sb_ds; 
    DBI sb_dbi; 
    DummyDao dummyDao; 

    @Override 
    public void run(
      final ProductServiceConfiguration configuration, 
      final Environment environment) { 

     sb_ds = configuration.getSbliveDataSourceFactory() 
       .build(environment.metrics(), "sblive"); 
     sb_dbi = new DBI(sb_ds); 
     dummyDao = sb_dbi.onDemand(DummyDao.class); 

    } 

} 

爲了驗證有沒有錯,我的連接,我暫時下面的代碼添加到我的run方法並返回預期結果:

try (Handle h = sb_dbi.open()) { 
    List<Map<String,Object>> result = 
     h.select("select initial_qty, current_qty from prod_detail where prod_sku = '10501034520008'"); 
    System.out.println("bootstrap: " + result.toString()); 
} 

使用相同參數執行我的DAO的getSku方法返回null。

有人能告訴我我做錯了什麼或指向我採取的措施,我可以採取措施找出是什麼原因造成的?我試圖調試它,但我對JDBI內部知識不夠了解,以瞭解我在看什麼。

回答

0

我發現了這個問題。問題是與綁定變量關聯的列被定義爲CHAR(20) - 不是VARCHAR(20) - 實際參數值的長度爲14.當我直接執行語句時(使用句柄或從SqlDeveloper),它工作正常。但是,當使用準備好的語句並綁定變量時,它已被破壞。

將參數填充爲20個字符可解決問題。

相關問題