JDBC에서 물음표 "?"가 포함된 PostgreSQL JSON(B) 연산자를 사용하는 방법
PostgreSQL은 물음표를 사용하는 여러 가지 방법을 제공합니다. 이름으로 다음 JSON과 같은 영리한 ASCII 연산자의 일부 연산자:
문제는 공식 PostgreSQL JDBC 드라이버가 이러한 연산자가 포함된 SQL 문자열을 올바르게 구문 분석할 수 없는 것 같습니다. 물음표를 일반 JDBC 바인드 변수로 간주합니다. 다음 코드...
try ( PreparedStatement s = c.prepareStatement("select '{}'::jsonb ?| array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
... 예외가 발생합니다.
org.postgresql.util.PSQLException: Für den Parameter 1 wurde kein Wert angegeben. at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:225) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161) at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
이 연산자를 어떻게 사용합니까?
두 가지 해결 방법이 있습니다.
1. 준비된 문 대신 정적 문을 사용합니다.
이것이 가장 간단한 해결 방법이지만 준비된 문의 모든 이점(성능, SQL 주입 보호 등)을 잃게 됩니다. 그러나 다음과 같이 하면 작동합니다.
try ( Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
2. 연산자를 사용하지 마세요. 대신 함수를 사용하세요(참고: 인덱싱은 사용되지 않을 수 있습니다)
연산자는 pg_catalog에 있는 지원되는 함수에 대한 구문 설탕일 뿐입니다. 이러한 함수의 이름을 찾는 방법은 다음과 같습니다.
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
위 작업으로 생성되는 결과는 다음과 같습니다.
oprname function ---------------------------------------------------------------------------------- ?| point_vert(point, point) ?| lseg_vertical(-, lseg) ?| line_vertical(-, line) ?| jsonb_exists_any(jsonb, text[]) <--- this is the one we're looking for ?| exists_any(hstore, text[])
따라서 가장 간단한 해결책은 연산자를 사용하는 것이 아니라 해당 함수를 사용하는 것입니다. 🎜>
위 내용은 물음표 '?'와 함께 PostgreSQL JSONB 연산자를 사용하는 방법 JDBC에서?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!