2013-03-26 12 views
6

Hier ist, was das jOOQ Handbuch über das Thema zu sagen hat:B/CLOB Handhabung in jOOQ

jOOQ derzeit nicht explizit JDBC BLOB und CLOB Daten Typen unterstützen. Wenn Sie einen dieser Datentypen in Ihrer Datenbank verwenden, wird jOOQ sie stattdessen Byte [] und String zuordnen. In einfachen Fällen (kleine Daten), ist diese Vereinfachung ausreichend. In komplizierteren Fällen, müssen Sie möglicherweise jOOQ umgehen, um mit diesen Datentypen umzugehen und ihre jeweiligen Ressourcen.

Gibt es eine Möglichkeit, einige von jOOQ zu umgehen, aber den Code relativ sauber zu halten? LOB-Parameter manuell binden, aber alles andere beispielsweise an jOOQ?

Und was sind die möglichen offensichtlichen Fallstricke, die ich vermeiden sollte?

+0

Abgesehen von Aarons Vorschlägen gibt es derzeit keine * "relativ saubere" * Möglichkeit, LOBs in jOOQ zu verarbeiten. Fühlen Sie sich frei, der [Diskussion über die jOOQ-Benutzergruppe] (https://groups.google.com/forum/?fromgroups=#!topic/jooq-user/TtVFLzXc9RA) beizutreten, um beim Definieren einer Feature-Anfrage zu helfen. –

Antwort

3

Ich habe zwei Lösungen dafür gefunden.

  1. Der Frühling Ansatz

  2. Non-Spring Ansatz

Im ersten Fall injizieren nur JdbcTemplate und diese Helfer-Code verwenden:

public static LobHandler getAppropriateLobHandler(Factory factory) { 
    LobHandler lobHandler = null; 
    switch(factory.getDialect()) { 
     case ORACLE: lobHandler = new OracleLobHandler(); break; 
     default: lobHandler = new DefaultLobHandler(); break; 
    } 
    return lobHandler; 
} 

Mit dieser Code zum Lesen von BLOBs:

return jdbcTemplate.queryForObject( 
     "select BLOB from TABLE where PK = ?", 
     args, 
     new RowMapper<InputStream>() { 

      @Override 
      public InputStream mapRow(ResultSet rs, int rowNum) throws SQLException { 
       return lobHandler.getBlobAsBinaryStream(rs, 1); 
      } 
     } 
    ); 

und das sie schreiben:

jdbcTemplate.execute(
      "update TABLE set BLOB = ? where PK = ?", 
      new AbstractLobCreatingPreparedStatementCallback(lobHandler) { 

       @Override 
       protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { 
        lobCreator.setBlobAsBinaryStream(ps, 1, stream, sizeInBytes); 
        ps.setLong(2, pk); 
       } 
      } 
     ); 

Im zweiten Fall verwenden JDBC die BLOBs lesen und zu schreiben, wenn Sie Oracle haben. Wenn Sie Oracle haben, müssen Sie ihre special C/BLOB locator pattern verwenden.

+0

Dies ist aber nützlich Es ist die einfache JDBC-Lösung, ein letzter Ausweg. Ich dachte an die jOQQ-Parameterbindung. – biziclop

+0

jOOQ unterstützt dies nicht, da dies nicht mit der Parameterbindung möglich ist. Eines der Probleme besteht darin, dass Sie einen Stream und eine Größe benötigen, d. H. Sie müssen * zwei * Parameter an einen Wert in der Abfrage binden. Das nächste Problem ist, wie Sie wissen, wann Sie den Stream schließen müssen. –

+0

Ich weiß, aber ich dachte daran, das PreparedStatement nach jooq abzufangen, um alle Parameter zu binden, und fügt das LOB hinzu. – biziclop