在使用 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(),但 配置文件未正確識別該註解,導致映射策略未生效。
jdbc.dicon 或 convention.dicon),確保枚舉類型處理器已正確註冊並支持 @PersistentValue。test_type 列應為字符串類型(VARCHAR/CHAR),以存儲 "02" 等代碼值。IN ('02')。ordinal()(順序敏感、擴展性差)。@PersistentValue 註解標註 getter 方法,而非字段。該問題本質是框架配置缺失導致默認映射策略生效。補全配置、確保 @PersistentValue 被正確識別,即可讓 JdbcManager 使用枚舉的 code 屬性進行查詢,解決 IN 條件值不匹配問題。