首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Seasar2 JdbcManager 枚舉類型查詢問題:IN 條件使用 ordinal 而非 code 值的解決方案

     編輯:程式設計疑難解答

問題場景

在使用 Seasar2 框架的 JdbcManager 進行枚舉類型查詢時,發現生成的 SQL IN 條件使用的是枚舉的 ordinal()(序號)而非自定義的 code 屬性值,導致查詢結果不符合預期。

實體定義

public enum TestEnumType {
    ENUM_TOYOTA("01", "豊田"),
    ENUM_HONDA("02", "本田");

    private final String code;
    private final String label;

    TestEnumType(String code, String label) {
        this.code = code;
        this.label = label;
    }

    @PersistentValue // 關鍵註解:指定持久化值
    public String getCode() { return code; }
    public String getLabel() { return label; }
}

@Entity
@Table(name = "test_table")
public class TestTableEntity {
    @Id
    @Column(name = "test_type")
    private TestEnumType testEnumType;
    // ... 其他字段
}

錯誤現象

調用 DAO 方法:

List param = Arrays.asList(TestEnumType.ENUM_HONDA);
List list = testDao.findById(param, false);

生成 SQL:

SELECT ... WHERE test_type IN (1) ... -- 應為 IN ('02')

此處 1 為 ENUM_HONDA.ordinal(),而非期望的 code="02"。

根本原因

Seasar2 默認使用枚舉的 ordinal() 進行數據庫映射。雖然實體類中使用了 @PersistentValue 註解標註 getCode(),但 配置文件未正確識別該註解,導致映射策略未生效。

解決方案

  1. 檢查並修正 Seasar2 配置文件(如 jdbc.dicon 或 convention.dicon),確保枚舉類型處理器已正確註冊並支持 @PersistentValue。
  2. 確認數據庫列類型:test_type 列應為字符串類型(VARCHAR/CHAR),以存儲 "02" 等代碼值。
  3. 驗證映射生效:重新運行查詢,檢查生成 SQL 是否為 IN ('02')。

最佳實踐建議

  • 枚舉持久化時顯式指定映射值,避免依賴 ordinal()(順序敏感、擴展性差)。
  • 使用 @PersistentValue 註解標註 getter 方法,而非字段。
  • 框架升級或遷移時,務必重新驗證枚舉映射行為。

總結

該問題本質是框架配置缺失導致默認映射策略生效。補全配置、確保 @PersistentValue 被正確識別,即可讓 JdbcManager 使用枚舉的 code 屬性進行查詢,解決 IN 條件值不匹配問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved