2017-10-21 9 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は、次のコードを経由して自分のアプリケーションのrunメソッドで初期化されている:

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

同じパラメータでmy DAOのgetSkuメソッドを実行するとnullが返されます。

私が間違っていることを誰かに教えてもらえますか、これを引き起こしている原因を突き止めるための対策を指摘できますか?私はそれをデバッグしようとしましたが、私は単に私が見ていることを理解するためにJDBI内部について十分に知りません。

答えて

0

問題が見つかりました。問題は、バインド変数に関連付けられた列がVARCHAR(20)ではなくCHAR(20)として定義され、実際のパラメータ値の長さが14であることです。 SqlDeveloper)、それは正常に動作します。しかし、準備されたステートメントとバインド変数を使用すると、壊れてしまいます。

パラメータを20文字にパディングして問題を解決します。

関連する問題