2016-07-31 3 views
0

Ich versuche, Code zu schreiben, der eine Liste von IDs erhält, die übereinstimmende Datensätze aus einer DB abrufen. Das sollte ziemlich einfach sein. Das ID-Feld ist jedoch vom Typ CHAR (20). Dies scheint ein Fall zu sein, in dem spring-data nicht richtig funktioniert, so dass meine Abfragen (obwohl sie funktional sind) keine Datensätze zurückgeben. Dies ist gegen die DB eines Herstellerprodukts, so dass die Änderungen, die ich an dem Schema vornehmen kann, begrenzt sind.JdbcTemplate-Abfrage in Oracle, die mit dem Feld mit festen Zeichen übereinstimmt

create table items (
     item_id char(20) 
) 

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

und die folgenden Anwendungscode:

@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."); 
     } 
} 

ich die Abfrage oben wie folgt anpassen können, und dies verschlechtert die Leistung an die Arbeit auf Kosten der ernst, da diese alle Indizes ignoriert.

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

Gibt es noch andere Lösungen, die ich berücksichtigen sollte? Ich nehme an, ich könnte JDBC nativ verwenden, aber bevor ich viel Code umschreibe, wollte ich sehen, ob es bessere Alternativen gibt. Es ist wahrscheinlich nicht möglich, jeden Datensatz einzeln zu betrachten, da ich davon ausgerebe, tausende davon zu verarbeiten.

Antwort

0

scheint die einfachste Lösung nur Pad ist die Werte im Code:

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