簡體   English   中英

jOOQ - DefaultRecordMapper - 區分大小寫

[英]jOOQ - DefaultRecordMapper - Case sensitivity

DefaultRecordMapper可以不區分大小寫嗎?

問題的原因是OracleH2如果不引用則具有默認的 captilazing 標識符行為(參見https://seeq.atlassian.net/wiki/spaces/KB/pages/443088907/SQL+Column+Names+and+案例+敏感性https://community.oracle.com/tech/developers/discussion/895094/is-there-anyway-to-make-oracle-field-names-case-insensitive-or-is-it-just ) . SQL Server不同,它在創建表時使用區分大小寫。

SQL output 的區分大小寫與 Oracle 和 H2 的 POJO 字段不匹配。

我能想到的唯一 2 個解決方案是:

  • 通過自己的輔助方法為每一列加上引號以確保正確區分大小寫( ITEMUNIT as "itemUnit" )。
  • 實現一個不區分大小寫的自己的記錄映射器。

然而,第一種解決方案有一個缺點。 如果使用fetch而不是fetchInto來原始處理結果,則列值的get方法也需要別名。 因此,開發人員需要知道僅對fetchInto使用 helper 方法和對fetch使用普通的select之間存在區別。

我錯過了什么嗎? 對此有更好/更簡單的解決方案嗎?

我找到了 https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-name-style/但這並不能解決問題。

您不能使DefaultRecordMapper不區分大小寫,目前(jOOQ 3.16)沒有這樣的配置,並且沒有任何實施此配置的計划,因為它似乎沒有必要,除了像您這樣的邊緣情況。

一些需要:

解決根本問題:命名不一致

  • 如果您的數據庫列稱為ITEMUNIT ,那么為什么不調用您的屬性itemunit 這是最規范的翻譯。 在這里人工制作駱駝套而不是蛇套,你並沒有真正獲得多少收益
  • 如果您的屬性確實需要被稱為itemUnit ,那么為什么不一致地將您的數據庫列命名為ITEM_UNIT呢?

在上述兩種方法中,您不需要不區分大小寫作為解決方法,而是在數據庫和應用程序中使用一致的命名。

解決命名不一致問題

如果上述方法不可行,您仍然可以使用各種方法來解決此問題:

  • 您可以使用 JPA @Column注釋來注釋您的屬性,jOOQ 支持
  • 您可以使用視圖或計算列來“修復”數據庫中錯誤選擇的名稱,並為每個人項目ITEMUNIT AS ITEM_UNIT
  • 您確實可以在每次使用反射DefaultRecordMapper時手動為列添加別名,但這很費力(您不必為所有列添加別名,只需為名稱不一致的列添加別名)
  • 您可以使用RecordMapperProvider覆蓋DefaultRecordMapper行為
  • 您可以避免使用反射映射和 map 使用

但在所有這一切中,我認為潛在的問題是命名不一致。 如果您只是一致地命名列/屬性,將會容易得多。 進行這種特殊區分沒有任何價值,只會帶來麻煩。

暫無
暫無

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

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