首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

ValueList HQL 整型參數自動轉換配置:告別手動 to_number()

     編輯:MySQL 資料庫相關知識

ValueList 框架中,queryMap 傳遞的參數默認皆為 String 類型。HQL 中直接賦值給整型字段會報類型不匹配錯誤。常見繞過方式是在 HQL 寫 to_number({param}),但此法存在遷移不兼容、維護成本高等問題。本文介紹通過 StatementBuilder 註冊 IntegerSetter 實現自動類型轉換。

問題場景

<property name="hql">
  <value>
    FROM TBaseAreas tb
    WHERE tb.status='1'
    /~hId : AND tb.hId = to_number{hId} ~/
    /~oId : AND tb.oId = to_number{oId} ~/
  </value>
</property>

痛點:每個整型參數都需手寫轉型函數,跨數據庫遷移時函數名不同(Oracle TO_NUMBER、MySQL CAST、PostgreSQL ::int)。

解決方案:註冊 IntegerSetter

<bean id="integerSetterHql" class="net.mlw.vlh.adapter.hibernate3.util.setter.IntegerSetter"/>

<bean id="statementBuilderHql" class="net.mlw.vlh.adapter.hibernate3.util.StatementBuilder">
  <property name="setters">
    <map>
      <entry key="uId"><ref bean="integerSetterHql"/></entry>
      <entry key="oId"><ref bean="integerSetterHql"/></entry>
      <!-- 批量註冊所有整型參數 -->
    </map>
  </property>
</bean>

原理機制

  1. ValueList 解析 HQL 時,識別參數佔位符(如 ~hId : ... ~)
  2. 構建查詢前,StatementBuilder 遍歷 setters Map
  3. 對匹配的參數名,調用對應 Setter.setValue() 進行類型轉換
  4. IntegerSetter 內部執行 Integer.valueOf(stringVal),再綁定為 JDBC Types.INTEGER

擴展:自定義類型轉換器

public class BigDecimalSetter implements Setter {
  public void setValue(Query query, String paramName, Object value) {
    query.setBigDecimal(paramName, new BigDecimal((String) value));
  }
}

<bean id="bigDecimalSetter" class="com.example.BigDecimalSetter"/>
<entry key="amount"><ref bean="bigDecimalSetter"/></entry>

優勢總結

維度HQL 手寫 to_numberSetter 自動轉換
遷移兼容性差(函數名綁定具體方言)優(框架層面統一處理)
維護成本高(每處參數重複寫)低(集中配置一次)
類型安全運行時發現綁定時強類型檢查
可讀性HQL 混雜轉型噪音HQL 純淨業務邏輯

適用場景

  • ValueList + Hibernate 3.x 專案
  • 大量整型/長整型/BigDecimal 參數
  • 計劃或可能進行數據庫遷移

集中配置類型轉換器,讓 HQL 回歸純業務表達,是框架正確使用姿勢。

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