2016-04-25 5 views
1

Unsere Oracle-Datenbank kann nicht geändert werden und hat viele Spalten als CHARS dargestellt. Derzeit passe ich Parameter manuell auf die Länge des Feldes aus, wenn z. so gegeben foo sind char (5) in der db ‚foo‘Ist setFixedCHAR() implementiert in JOOQ

String foo = "foo" 

...  
     .where(FOO_TABLE.FOO.equal(StringUtils.rightPad(foo,FOO_TABLE.FOO.getDataType().length())) 

ist es eine Möglichkeit, dass ich sage jOOQ kann, dass foo ein Zeichen ist es einen gepolsterten Vergleich wie in rostigen führt die Roboter antworten here

Antwort

1

Sie könnten eine data type binding für alle CHAR Spalten und entweder werfen die bind-Variable in der generierten SQL-Zeichenfolge implementieren:

@Override 
public final void sql(BindingSQLContext<String> ctx) throws SQLException { 
    ctx.render().sql("CAST(? AS CHAR(5))"); 
} 

(ich habe gerade bemerkt, dass es Zugriff auf die CHAR Länge des Erhaltens keine Möglichkeit gibt, auf diese Weise ... sollte dies behoben sein: https://github.com/jOOQ/jOOQ/issues/5223)

Oder kürzen/pad die Bindevariable, bevor sie an die vorbereitete Anweisung gebunden wird. Oder Sie könnten use that logic you referenced to direkt in Ihrer variablen Bindungslogik Ihres Datentyps binden.

@Override 
public final void set(BindingSetStatementContext<String> ctx) throws SQLException { 
    ctx.statement() 
     .unwrap(OraclePreparedStatement.class) 
     .setFixedChar(ctx.index(), ctx.value()); 
} 

Jeder dieser Ansätze würde es Ihnen ermöglichen, diese Logik nur einmal zu implementieren.