2013-03-26 3 views
6

Вот что руководство jOOQ должен сказать о предмете:B/CLOB в jOOQ

jOOQ в настоящее время не поддерживает явно JDBC BLOB и CLOB данных типов. Если вы используете какой-либо из этих типов данных в своей базе данных, jOOQ будет сопоставить их байту [] и String. В простых случаях (небольшие данные) это упрощение достаточно. В более сложных случаях вам необходимо обойти jOOQ, чтобы справиться с этими типами данных и своих соответствующих ресурсов.

Есть ли способ обойти некоторые из jOOQ, но сохранить код относительно чистым? Связать параметры LOB вручную, но, оставив все остальное в jOOQ, например?

И каковы возможные явные подводные камни, которых я должен избегать?

+0

Помимо предложений Aaron, в настоящее время нет никакого «относительно чистого» * ​​способа обработки LOB в jOOQ. Не стесняйтесь присоединяться к [дискуссии в группе пользователей jOOQ] (https://groups.google.com/forum/?fromgroups=#!topic/jooq-user/TtVFLzXc9RA), чтобы помочь определить запрос функции. –

ответ

3

Я нашел два решения для этого.

  1. Спринг подход

  2. Non-Спринг подход

В первом случае просто впрыснуть JdbcTemplate и использовать этот вспомогательный код:

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; 
} 

Используйте этот код для чтения BLOB:

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); 
      } 
     } 
    ); 

и это написать им:

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); 
       } 
      } 
     ); 

Во втором случае используйте JDBC для чтения и записи BLOB-если у вас есть Oracle. Когда у вас есть Oracle, вам нужно использовать их special C/BLOB locator pattern.

+0

Это полезно, но это простое решение для ванильного JDBC, последнее средство. Я думал о том, как мешать привязке параметров jOOQ. – biziclop

+0

jOOQ не поддерживает его, потому что это невозможно сделать с привязкой параметров. Одна из проблем заключается в том, что вам нужен поток и размер, то есть вам нужно привязать * два * параметра к одному значению в запросе. Следующая проблема заключается в том, как узнать, когда закрыть поток. –

+0

Я знаю, но я думал перехватить PreparedStatement после того, как jOOQ привязал все параметры, которые он может, и добавит к нему LOB. – biziclop