diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 9b7340f6d..935eaca36 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -6,6 +6,7 @@ package org.redkale.source; import java.io.Serializable; +import java.math.BigDecimal; import java.sql.*; import java.util.*; import java.util.concurrent.*; @@ -3001,6 +3002,24 @@ public class DataJdbcSource extends AbstractDataSqlSource { } } + @Override + public BigDecimal getBigDecimal(int index) { + try { + return rr.getBigDecimal(index); + } catch (SQLException e) { + throw new SourceException(e); + } + } + + @Override + public BigDecimal getBigDecimal(String column) { + try { + return rr.getBigDecimal(column); + } catch (SQLException e) { + throw new SourceException(e); + } + } + @Override public Boolean getBoolean(int index) { try { diff --git a/src/main/java/org/redkale/source/DataResultSetRow.java b/src/main/java/org/redkale/source/DataResultSetRow.java index e73ef626c..706495fba 100644 --- a/src/main/java/org/redkale/source/DataResultSetRow.java +++ b/src/main/java/org/redkale/source/DataResultSetRow.java @@ -5,6 +5,7 @@ package org.redkale.source; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; import org.redkale.annotation.ClassDepends; import org.redkale.annotation.Nullable; @@ -44,6 +45,13 @@ public interface DataResultSetRow { @ClassDepends public byte[] getBytes(String columnLabel); + // columnIdex从1开始 + @ClassDepends + public BigDecimal getBigDecimal(int columnIdex); + + @ClassDepends + public BigDecimal getBigDecimal(String columnLabel); + // columnIdex从1开始 @ClassDepends public Boolean getBoolean(int columnIdex); diff --git a/src/main/java/org/redkale/source/EntityFullFunc.java b/src/main/java/org/redkale/source/EntityFullFunc.java index bf62eeada..0f91ae102 100644 --- a/src/main/java/org/redkale/source/EntityFullFunc.java +++ b/src/main/java/org/redkale/source/EntityFullFunc.java @@ -5,6 +5,7 @@ package org.redkale.source; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Objects; import org.redkale.annotation.ClassDepends; import org.redkale.asm.Asms; @@ -434,6 +435,25 @@ public abstract class EntityFullFunc { mv.visitFieldInsn(PUTFIELD, entityName, field.getName(), "[B"); continue; } + } else if (attr.type() == BigDecimal.class) { + if (setter != null) { + String desc = Type.getMethodDescriptor(setter); + mv.visitVarInsn(ALOAD, 2); // obj + mv.visitVarInsn(ALOAD, 1); // row + Asms.visitInsn(mv, attrIndex); + mv.visitMethodInsn( + INVOKEINTERFACE, rowName, "getBigDecimal", "(I)Ljava/math/BigDecimal;", true); + mv.visitMethodInsn(INVOKEVIRTUAL, entityName, setter.getName(), desc, false); + continue; + } else if (field != null) { + mv.visitVarInsn(ALOAD, 2); // obj + mv.visitVarInsn(ALOAD, 1); // row + Asms.visitInsn(mv, attrIndex); + mv.visitMethodInsn( + INVOKEINTERFACE, rowName, "getBigDecimal", "(I)Ljava/math/BigDecimal;", true); + mv.visitFieldInsn(PUTFIELD, entityName, field.getName(), "Ljava/math/BigDecimal;"); + continue; + } } mv.visitVarInsn(ALOAD, 0); Asms.visitInsn(mv, attrIndex); @@ -737,6 +757,23 @@ public abstract class EntityFullFunc { mv.visitTypeInsn(CHECKCAST, "[B"); mv.visitFieldInsn(PUTFIELD, entityName, field.getName(), "[B"); } + } else if (attr.type() == BigDecimal.class) { + if (setter != null) { + String desc = Type.getMethodDescriptor(setter); + mv.visitVarInsn(ALOAD, 2); // obj + mv.visitVarInsn(ALOAD, 1); // values + Asms.visitInsn(mv, attrIndex); + mv.visitInsn(AALOAD); + mv.visitTypeInsn(CHECKCAST, "java/math/BigDecimal"); + mv.visitMethodInsn(INVOKEVIRTUAL, entityName, setter.getName(), desc, false); + } else if (field != null) { + mv.visitVarInsn(ALOAD, 2); // obj + mv.visitVarInsn(ALOAD, 1); // values + Asms.visitInsn(mv, attrIndex); + mv.visitInsn(AALOAD); + mv.visitTypeInsn(CHECKCAST, "java/math/BigDecimal"); + mv.visitFieldInsn(PUTFIELD, entityName, field.getName(), "Ljava/math/BigDecimal;"); + } } else { if (setter != null) { String desc = Type.getMethodDescriptor(setter); diff --git a/src/test/java/org/redkale/test/source/EntityFullFuncTest.java b/src/test/java/org/redkale/test/source/EntityFullFuncTest.java index d888fe636..a2fc9b6dc 100644 --- a/src/test/java/org/redkale/test/source/EntityFullFuncTest.java +++ b/src/test/java/org/redkale/test/source/EntityFullFuncTest.java @@ -4,6 +4,7 @@ */ package org.redkale.test.source; +import java.math.BigDecimal; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -78,6 +79,16 @@ public class EntityFullFuncTest { return null; } + @Override + public BigDecimal getBigDecimal(int columnIdex) { + return BigDecimal.ZERO; + } + + @Override + public BigDecimal getBigDecimal(String columnLabel) { + return BigDecimal.ZERO; + } + @Override public Boolean getBoolean(int columnIdex) { return true; diff --git a/src/test/java/org/redkale/test/source/FullBean.java b/src/test/java/org/redkale/test/source/FullBean.java index 51e3a00be..19aed9252 100644 --- a/src/test/java/org/redkale/test/source/FullBean.java +++ b/src/test/java/org/redkale/test/source/FullBean.java @@ -4,6 +4,7 @@ */ package org.redkale.test.source; +import java.math.BigDecimal; import java.math.BigInteger; import java.util.Set; import org.redkale.convert.json.JsonConvert; @@ -25,6 +26,8 @@ public class FullBean { private BigInteger number; + private BigDecimal scale; + private boolean flag; private short status; @@ -111,6 +114,14 @@ public class FullBean { this.number = number; } + public BigDecimal getScale() { + return scale; + } + + public void setScale(BigDecimal scale) { + this.scale = scale; + } + public boolean isFlag() { return flag; } diff --git a/src/test/java/org/redkale/test/source/FullBean2.java b/src/test/java/org/redkale/test/source/FullBean2.java index 65e8cbfac..1c733486b 100644 --- a/src/test/java/org/redkale/test/source/FullBean2.java +++ b/src/test/java/org/redkale/test/source/FullBean2.java @@ -4,6 +4,7 @@ */ package org.redkale.test.source; +import java.math.BigDecimal; import java.math.BigInteger; import java.util.Set; import org.redkale.convert.json.JsonConvert; @@ -25,6 +26,8 @@ public class FullBean2 { public BigInteger number; + public BigDecimal scale; + public boolean flag; public short status;