2014-01-27 2 views
11

Есть ли способ использовать PostgreSQL json/hstore с jdbctemplate? поддержка запросов esp.Как использовать PostgreSQL hstore/json с jdbctemplate

для например:

hstore:

INSERT INTO hstore_test (data) VALUES ('"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"') 

SELECT data -> 'key4' FROM hstore_test 
SELECT item_id, (each(data)).* FROM hstore_test WHERE item_id = 2 

для Json

insert into jtest (data) values ('{"k1": 1, "k2": "two"}'); 
select * from jtest where data ->> 'k2' = 'two'; 

ответ

17

Хотя довольно поздно для ответа (для вставки части), я надеюсь, что это может быть полезным кому-то еще :

Возьмите пары ключ/значение в HashMap:

Map<String, String> hstoreMap = new HashMap<>(); 
hstoreMap.put("key1", "value1"); 
hstoreMap.put("key2", "value2"); 

PGobject jsonbObj = new PGobject(); 
jsonbObj.setType("json"); 
jsonbObj.setValue("{\"key\" : \"value\"}"); 

использование одним из следующим образом, чтобы вставить их в PostgreSQL:

1)

jdbcTemplate.update(conn -> { 
    PreparedStatement ps = conn.prepareStatement("INSERT INTO table (hstore_col, jsonb_col)"); 
    ps.setObject(1, hstoreMap); 
    ps.setObject(2, jsonbObj); 
}); 

2)

jdbcTemplate.update("INSERT INTO table (hstore_col, jsonb_col) VALUES(?,?)", 
new Object[]{ hstoreMap, jsonbObj }, new int[]{Types.OTHER, Types.OTHER}); 

3) Set hstoreMap/jsonbObj в POJO (hstoreCol типа Map и jsonbObjCol имеет тип PGObject)

BeanPropertySqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(POJO); 
sqlParameterSource.registerSqlType("hstore_col", Types.OTHER); 
sqlParameterSource.registerSqlType("jsonb_col", Types.OTHER); 
namedJdbcTemplate.update("INSERT INTO table (hstore_col, jsonb_col) VALUES (:hstoreCol, :jsonbObjCol)", sqlParameterSource); 

И получить значение:

(Map<String, String>) rs.getObject("hstore_col")); 
((PGobject) rs.getObject("jsonb_col")).getValue(); 
+0

удивительно, что до сих пор не работает для меня. исправлено обновление до последнего драйвера версии postgres. – linqu

Смежные вопросы