Jdbi: postgres์—์„œ jsonb ๋ฌผ์Œํ‘œ ์—ฐ์‚ฐ์ž ์ด์Šค์ผ€์ดํ”„

์— ๋งŒ๋“  2015๋…„ 09์›” 18์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jdbi/jdbi

postgres ๋ฐ jsonb์™€ ํ•จ๊ป˜ jdbi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

select id, data from some_table where data ? :key

๋ถˆํ–‰ํžˆ๋„ jdbi๋Š” ์ด ๋ฌผ์Œํ‘œ๋ฅผ ๋ณ€์ˆ˜์˜ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. postgres ๋ฌผ์Œํ‘œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌผ์Œํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ jdbc์˜ ์—…์ŠคํŠธ๋ฆผ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ํƒˆ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ??์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ:

select id, data from some_table where data ?? :key

๋ชจ๋“  6 ๋Œ“๊ธ€

๋ฐฑ์Šฌ๋ž˜์‹œ \? ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜, ๋‚ด๊ฐ€ ๊ทธ๊ฑธ ์–ธ๊ธ‰ํ–ˆ์–ด์•ผ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ณธ๋Šฅ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Exception in thread "main" org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.postgresql.util.PSQLException: No value specified for parameter 2. [statement:"select id, createdDate, data from something where data \? ?", located:"select id, createdDate, data from something where data \? ?", rewritten:"select id, createdDate, data from something where data ? ?", arguments:{ positional:{0:'pattern'}, named:{}, finder:[]}]
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1334)
    at org.skife.jdbi.v2.Query.fold(Query.java:173)
    at org.skife.jdbi.v2.Query.list(Query.java:82)
    at org.skife.jdbi.v2.Query.list(Query.java:75)
    at com.ngc.vault.eventer.Query.hasKey(Query.java:45)
    at com.ngc.vault.eventer.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:228)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:163)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
    ... 5 more

์ด๊ฒƒ์€ jdbc์˜ ์—…์ŠคํŠธ๋ฆผ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ํƒˆ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ??์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ:

select id, data from some_table where data ?? :key

ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค ์ฟผ๋ฆฌ
SELECT json_data FROM employee where json_data -> 'employee' @> '{"name":"Aman"}'

์œ„์˜ ์ฟผ๋ฆฌ๋Š” postgres์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ jdbctemplate์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ์ฝ”๋“œ

String sql="SELECT json_data FROM employee where json_data -> 'employee' @> '{\"name\":\"?\"}'";

List<Map<String, Object>> emp = jdbcTemplate.queryForList(sql,param);

์ฝ”๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ค„์„ ๋งŒ๋‚˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. - ์—ด ์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค: 1, ์—ด ์ˆ˜: 0.; ์ค‘์ฒฉ ์˜ˆ์™ธ๋Š” org.postgresql.util.PSQLException์ž…๋‹ˆ๋‹ค.

'?'๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž๋ฆฌ ํ‘œ์‹œ์ž.

๊ทธ๊ฒƒ์€ JDBC ์‚ฌ์–‘์— ๋”ฐ๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ? ๋งˆ์ปค๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•ด๋‹น JSON ๋ฌธ์ž์—ด๋กœ ๋ณด๊ฐ„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Postgres ์—ฐ๊ฒฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SELECT json_data
FROM employee
WHERE json_data -> 'employee' @> ('{"name": "' || ? || '"}')

๋˜ํ•œ ์ด๊ฒƒ์€ JdbcTemplate์ด ์•„๋‹ˆ๋ผ Jdbi ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰