package jef.database.dialect.type; import java.lang.annotation.Annotation; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import javax.persistence.EnumType; import javax.persistence.Enumerated; import jef.accelerator.bean.BeanAccessor; import jef.database.Field; import jef.database.dialect.ColumnType; import jef.database.dialect.DatabaseDialect; import jef.database.jdbc.result.IResultSet; import jef.database.meta.ITableMetadata; import jef.tools.StringUtils; public class CharEnumMapping extends AColumnMapping { private boolean isOrdinal; public int getSqlType() { return java.sql.Types.CHAR; } public Object jdbcSet(PreparedStatement st, Object value, int index, DatabaseDialect session) throws SQLException { if(value==null){ st.setNull(index, java.sql.Types.CHAR); }else{ String result=toString(value); st.setString(index, result); value=result; } return value; } @Override protected String getSqlExpression(Object value, DatabaseDialect profile) { return super.wrapSqlStr(toString(value)); } @SuppressWarnings("unchecked") public Object jdbcGet(IResultSet rs, int n) throws SQLException { String s=rs.getString(n); if(s==null || s.length()==0)return null; if(isOrdinal) { int cnt=StringUtils.toInt(s, 0); Enum<?>[] enums=clz.asSubclass(Enum.class).getEnumConstants(); return enums[cnt]; }else { return Enum.valueOf(clz.asSubclass(Enum.class), s); } } @Override protected Class<?> getDefaultJavaType() { return Enum.class; } @Override public void init(Field field, String columnName, ColumnType type, ITableMetadata meta) { super.init(field, columnName, type, meta); BeanAccessor ba = meta.getContainerAccessor(); Map<Class<?>,Annotation> map=ba.getAnnotationOnField(field.name()); Enumerated anno = map==null?null:(Enumerated)map.get(Enumerated.class); if (anno != null) { this.isOrdinal = anno.value() == EnumType.ORDINAL; } } private String toString(Object value) { if(isOrdinal) { return String.valueOf(((Enum<?>)value).ordinal()); }else { return value.toString(); } } @Override public void jdbcUpdate(ResultSet rs, String columnIndex, Object value, DatabaseDialect dialect) throws SQLException { rs.updateString(columnIndex, toString(value)); } }