[英]How to map an int[] to an integer[] in postgres using mybatis
我的java pojo中有一個整數數組int []大小。 我將它存儲在postgres中,其大小為integer []。 我正在嘗試使用mybatis將其映射為如下結果圖:
<resultMap id="result" type="javaPojo">
<result column="sizes" jdbcType="ARRAY" property="sizes"/>
</resultMap>
每次遇到類似以下錯誤:
解析SQL Mapper配置時出錯,導致java.lang.IllegalStateException:找不到屬性大小的類型處理程序。
一切都是使用Java程序生成的,由於公司政策我無法透露。
由於typeHandlers不支持int []而收到此錯誤。 有關mybatis的更多詳細支持類型,請參閱: Type Handlers Mybatis 。
現在,我為您提供2種解決方案。
在此處創建新的類型處理程序。
將int[]
更改為List<Integer>
。
示例代碼:
只需將resultType聲明為所需的原始類型,在您的情況下為Integer。 它將作為列表返回。
<select id="getPrice" resultType="java.lang.Integer">
select product_price from products
</select>
在映射器界面中,您應該期望返回Long列表。
List<Integer> getPrice();
我從此鏈接克隆了上面的示例
MyBatis具有內置的ArrayTypeHandler
,但是,它可能返回Integer[]
而不是int[]
(這取決於驅動程序的ResultSet#getArray()
實現)。
如果可以將屬性類型更改為Integer[]
,則有兩種使用內置ArrayTypeHandler
。
本地設置:在<result />
顯式指定typeHandler
。
<result column="sizes" jdbcType="ARRAY" property="sizes" typeHandler="org.apache.ibatis.type.ArrayTypeHandler" />
全局設置:在MyBatis配置中針對int[]
注冊ArrayTypeHandler
。 使用XML config,它將如下所示。
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.ArrayTypeHandler" javaType="int[]" jdbcType="ARRAY" /> </typeHandlers>
如果由於某種原因該屬性類型必須為int[]
,則可能必須編寫一個自定義類型處理程序,以將Integer[]
轉換為int[]
。
假設您使用的是MyBatis 3.5.0或更高版本,則可以對內置實現進行子類化並重寫extractArray()
方法。
import java.sql.Array;
import java.sql.SQLException;
import java.util.Arrays;
import org.apache.ibatis.type.ArrayTypeHandler;
public class IntArrayTypeHandler extends ArrayTypeHandler {
@Override
protected Object extractArray(Array array) throws SQLException {
Integer[] src = (Integer[]) super.extractArray(array);
int[] dest = new int[src.length];
// Assuming there is no null in the data
Arrays.setAll(dest, i -> src[i]);
return dest;
}
}
用法與內置的用法基本相同。
但是,在XML配置中指定javaType
時, javaType
必須為_int[]
因為int
是Integer
的別名 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.