2016-07-31 103 views
0

我想寫一些代碼,它給出了一個ID列表從數據庫中提取匹配記錄。這應該是非常簡單的。但是,ID字段的類型是CHAR(20)。這似乎是一個例子,春季數據不能正確處理,所以我的查詢(功能)不返回任何記錄。這是針對供應商產品的數據庫的,因此我對模式所做的更改是有限的。Oracle中與固定字符字段匹配的JdbcTemplate查詢

create table items (
     item_id char(20) 
) 

insert into items (item_id) values ('12345'); 

和下面的應用程序代碼:

@SpringBootApplication 
public class MyWorker { 
     @Autowired 
     private NamedParameterJdbcTemplate myDb; 

     private static final String query = "select item_id\n" + 
      "from items\n" + 
      "where item_id in (:item_ids)"; 

     public void main(String[] args) { 
      SpringApplication app = new SpringApplication(MyWorker.class); 
      app.setWebEnvironment(false); 
      app.run(args); 
     } 

     public void run(String ... args) { 
      String[] lookupIds = new String[] { "12345" }; 
      MapSqlParameterSource paramMap = new MapSqlParameterSource(); 
      paramMap.addValue("item_ids", Arrays.asList(lookupIds), java.sql.Types.CHAR); 

      System.out.println("Starting."); 
      myDb.query(QueryConfiguration.skuQueryStockedById, paramMap , 
      r -> { 
        System.out.println("Read " + r.getString(1)); 
      }); 
      System.out.println("Done."); 
     } 
} 

我可以調整上述如下查詢並得到這個工作,在嚴重退化性能爲代價,因爲這忽略任何索引。

select item_id 
from items 
where rtrim(item_id) in (:item_ids) 

我還有其他解決方案嗎?我假設我可以原生使用JDBC,但是在我重寫了很多代碼之前,我想查看是否有更好的選擇。單獨查看每條記錄可能不可行,因爲我期望處理數千個這樣的記錄。

回答

0

似乎最簡單的解決方案僅僅是墊在代碼中的值:

String[] lookupIds = new String[] { "12345" }; 
    MapSqlParameterSource paramMap = new MapSqlParameterSource(); 
    List<String> paddedIds = Arrays.asList(lookupIds).stream() 
     .map(i -> { return String.format("%1$-40s",i); }) 
     .collect(Collectors.toList()); 
    paramMap.addValue("item_ids", paddedIds, java.sql.Types.CHAR);