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.