我有一个包含2个数据库连接的DropWizard项目:一个MySql和一个Oracle(v11)。 MySql连接和查询工作得很好。我没有从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());
}
使用相同的参数执行我的DAO的getSku方法将返回null。
有人可以告诉我我做错了什么或者指出我可以采取哪些措施来弄清楚是什么导致了这个问题?我试着调试它,但我对JDBI内部结构的了解不够,无法理解我正在看的内容。
答案 0 :(得分:0)
我发现了这个问题。问题是与绑定变量关联的列被定义为CHAR(20) - 而不是VARCHAR(20) - 并且实际参数值的长度为14.当我直接执行语句时(使用句柄或来自SqlDeveloper),它工作正常。但是当使用预准备语句和绑定变量时,它就会被破坏。
将参数填充为20个字符可以解决问题。