簡體   English   中英

使用 Oracle RAW 類型的 JOOQ Where 子句

[英]JOOQ Where clause using Oracle RAW type

我正在嘗試編寫一個 JOOQ 查詢,它需要通過 UUID 進行搜索,UUID 以 RAW 類型存儲在 Oracle 數據庫中。 在 Jooq 生成的實體中,這些類型的字段被定義為字節數組。

簡單地將字符串轉換為字節數組不會找到匹配的值: jooqQuery.addConditions(TABLE.UUID_COLUMN.eq(UUID_AS_STRING).getBytes()));

另一方面,將列名轉換為字符串時:

jooqQuery.addConditions(TABLE.UUID_COLUMN.cast(String.class).eq(UUID_AS_STRING));

在運行時產生 jdbc 異常:

"class":"ohengine.jdbc.spi.SqlExceptionHelper","rest":"ORA-00906: missing left parenthesis\\n"

有沒有正確的方法來轉換它以生成一個可以正常工作的有效 sql?

編輯:我也嘗試過使用TABLE.UUID_COLUMN.getDataType().convert(UUID_AS_STRING)結果查詢與使用相同的空搜索結果執行 getBytes() 相同

已解決:使用此方法,將 UUID 轉換為正確的字節數組:

    private byte[] getUUIDtoBytes(UUID devId) {
        byte[] uuidBytes = new byte[16];
        ByteBuffer.wrap(uuidBytes)
                .order(ByteOrder.BIG_ENDIAN)
                .putLong(devId.getMostSignificantBits())
                .putLong(devId.getLeastSignificantBits());
        return uuidBytes;
    }

我懷疑您是否已將 UUID 存儲為uuid.getBytes() 調用String.getBytes()將產生字符串的 unicode 編碼,這對於存儲已經是十六進制格式的 UUID 來說是一種浪費的方式。 更可能的編碼記錄在這個 SO question here 中

無論如何,您應該找出您的 UUID 值是如何存儲和編碼的,並重用該編碼機制。 使用 jOOQ,理想情況下,您可以將數據類型綁定或轉換器附加到您的UUID_COLUMN ,這樣您就不必在任何 jOOQ 查詢中再次考慮這一點。 更多關於這里的信息: https : //www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM