將 JOOQ 3.5.2 與 MySQL 5.7 一起使用,我正在嘗試完成以下任務(wù)...MySQL 有一組 JSON 函數(shù),允許對(duì)較大文檔中的屬性進(jìn)行路徑定向操作。我正在嘗試使用 JOOQ 進(jìn)行抽象,以利用這一點(diǎn)。我首先創(chuàng)建了 JSON 可序列化的文檔模型,它跟蹤更改,然后Binding為其實(shí)現(xiàn)了 JOOQ 自定義。在此綁定中,我擁有生成對(duì)這些 MySQL JSON 函數(shù)的調(diào)用所需的所有狀態(tài)信息,但要更新的列的限定名稱(chēng)或別名除外。就地更新現(xiàn)有 JSON 文檔需要對(duì)此名稱(chēng)的引用。我一直無(wú)法找到從ContextBinding 接口中可用的 *類(lèi)型訪問(wèn)此名稱(chēng)的方法。我一直在考慮實(shí)現(xiàn)一個(gè)VisitListener來(lái)捕獲這些字段名稱(chēng)并通過(guò)Scope自定義數(shù)據(jù)映射傳遞它們,但該選項(xiàng)似乎非常脆弱。在我的 Binding 實(shí)現(xiàn)中訪問(wèn)字段名稱(chēng)或別名的最佳方法是什么?- 編輯 -好的,為了幫助澄清我的目標(biāo),請(qǐng)使用以下 DDL:create table widget ( widget_id bigint(20) NOT NULL, jm_data json DEFAULT NULL, primary key (widget_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8現(xiàn)在讓我們假設(shè) jm_data 將保存 a 的 JSON 表示java.util.Map<String,String>。為此,JOOQ 通過(guò)實(shí)現(xiàn)和注冊(cè)自定義數(shù)據(jù)類(lèi)型綁定(在本例中使用 Jackson)提供了一個(gè)非常好的擴(kuò)展 API:public class MySQLJSONJacksonMapBinding implements Binding<Object, Map<String, String>> { private static final ObjectMapper mapper = new ObjectMapper(); // The converter does all the work @Override public Converter<Object, Map<String, String>> converter() { return new Converter<Object, Map<String, String>>() { @Override public Map<String, String> from(final Object t) { try { return t == null ? null : mapper.readValue(t.toString(), new TypeReference<Map<String, String>>() { }); } catch (final IOException e) { throw new RuntimeException(e); } } @Override public Object to(final Map<String, String> u) { try { return u == null ? null : mapper.writer().writeValueAsString(u); } catch (final JsonProcessingException e) { throw new RuntimeException(e); } }
添加回答
舉報(bào)
0/150
提交
取消