2017-10-21 7 views
0

J'ai un projet DropWizard avec 2 connexions de base de données: une MySql et une Oracle (v11). La connexion MySql et les requêtes fonctionnent très bien. Je ne reçois aucune donnée de mes requêtes Oracle et il n'y a pas d'erreurs dans mes journaux.Une requête Oracle simple utilisant JDBI de DropWizard n'exécute pas/retourne le résultat

Mon DOA ressemble à ceci:

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

} 

Mon mappeur ressemble à ceci. Lorsque j'ai ajouté des instructions au mappeur, j'ai pu vérifier qu'il n'était jamais appelé.

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")); 

    } 

} 

Le DAO est en cours d'initialisation dans ma méthode de l'application de l'exécution par le code suivant:

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

    } 

} 

Afin de vérifier qu'il n'y a rien de mal à mon égard, j'ajouté temporairement le code suivant à ma méthode d'exécution et il renvoie le résultat attendu:

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

exécution méthode getSku de mon DAO avec le même paramètre renvoie nULL. Quelqu'un peut-il me dire ce que je fais de mal ou me signaler les mesures que je peux prendre pour comprendre ce qui cause cela?

J'ai essayé de le déboguer, mais je n'en sais tout simplement pas assez sur les internes de JDBI pour avoir une idée de ce que je regarde.

Répondre

0

J'ai trouvé le problème. Le problème est que la colonne associée à la variable de liaison est définie comme CHAR (20) - pas VARCHAR (20) - et la valeur réelle du paramètre a une longueur de 14. Lorsque j'exécute l'instruction directement (en utilisant le handle ou de SqlDeveloper), ça marche bien. Mais lorsque vous utilisez une instruction préparée et liez des variables, c'est cassé.

Le remplissage du paramètre sur 20 caractères résout le problème.