programing

jOOQ가 DSL.condition()의 값을 바인딩하지 않습니다.

oldcodes 2023. 6. 8. 22:31
반응형

jOOQ가 DSL.condition()의 값을 바인딩하지 않습니다.

jOOQ를 사용하는 코드는 다음과 같습니다.

        dslContext.select(CONNECTOR.asterisk())
            .from(CONNECTOR)
            .where(DSL.and(
                CONNECTOR.STATUS.notEqual(ConnectorStatus.DELETED.name()),
                DSL.condition("JSON_CONTAINS(vendor_data, '\"?\"', '$.id')", id)
            ))
            .fetchInto(Connector.class);

문제는 이 일반 SQL 조건에 있습니다. 문서에서 바인딩을 전달할 수 있다고 하지만 어떤 이유로 '?'가 결과 SQL에 채워지지 않습니다.

로그에서 얻은 결과 SQL:

select `connector`.* from `connector` where (`connector`.`status` <> 'DELETED' and (JSON_CONTAINS(vendor_data, '"?"', '$.id')))

제가 무엇을 빠뜨리고 있나요?그것을 제대로 하는 방법은 무엇입니까?

jOOQ 버전: 3.12.1

일반 SQL 템플릿 처리에는 일반 SQL 템플릿에 대한 매뉴얼 섹션에 설명된 대로 문자열 리터럴 및 주석 수정을 방지하는 작은 파서가 포함됩니다.문자열 리터럴은 JDBC에서도 서버 구현에서도 바인딩 매개 변수를 포함할 수 없기 때문에 이 기능이 필요합니다.

넌 두가지 옵션이 있다 :

  • 사용JSON대신 바인딩 값(예:JSON.json("\"" + id + "\"")(JSON을 제대로 탈출했는지 확인합니다.
  • 서버의 JSON에 바인딩 값을 캐스팅합니다.JSON_QUOTE(CAST(? AS VARCHAR))

아직 jOOQ 3.12를 사용하고 계신 것 같습니다.이후 버전의 jOOQ에서는 수많은 JSON 지원을 구현했으므로 업그레이드하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/75889763/jooq-not-binding-values-in-dsl-condition

반응형