package org.dayatang.domain; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.time.DateUtils; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.EnumType; import javax.persistence.Enumerated; import java.math.BigDecimal; import java.text.ParseException; import java.util.Date; /** * 值。这个类主要用于实体类的自定义属性,例如动态地给Employee类添加一批属性, 每个属性都记录数据类型和字符串形式的值 * * @author chencao * */ @Embeddable public class Value implements ValueObject { private static final long serialVersionUID = 4254026874177282302L; private static final String[] DATE_TIME_FORMAT = { "yyyy-MM-dd", "hh:mm", "hh:mm:ss", "yyyy-MM-dd hh:mm", "yyyy-MM-dd hh:mm:ss",}; @Enumerated(EnumType.STRING) @Column(name = "data_type") private DataType dataType; @Column(name = "obj_value") private String value = ""; /** * 创建字符串值 * * @param value 字符串形式的值 * @return 一个字符串类型的值 */ public static Value stringValue(String value) { return new Value(DataType.STRING, value); } /** * 创建整数值 * * @param value 字符串形式的值 * @return 一个整数类型的值 */ public static Value intValue(String value) { return new Value(DataType.INT, value); } /** * 创建长整型值 * * @param value 字符串形式的值 * @return 一个长整数类型的值 */ public static Value longValue(String value) { return new Value(DataType.LONG, value); } /** * 创建浮点值 * * @param value 字符串形式的值 * @return 一个小数类型的值 */ public static Value doubleValue(String value) { return new Value(DataType.DOUBLE, value); } /** * 创建BigDecimal值 * * @param value 字符串形式的值 * @return 一个BigDecimal类型的值 */ public static Value bigDecimalValue(String value) { return new Value(DataType.BIG_DECIMAL, value); } /** * 创建布尔型值 * * @param value 字符串形式的值 * @return 一个布尔类型的值 */ public static Value booleanValue(String value) { return new Value(DataType.BOOLEAN, value); } /** * 创建日期型值(无时间部分) * * @param value 字符串形式的值 * @return 一个日期类型的值 */ public static Value dateValue(String value) { return new Value(DataType.DATE, value); } /** * 创建时间型值(无日期部分) * * @param value 字符串形式的值 * @return 一个时间类型的值 */ public static Value timeValue(String value) { return new Value(DataType.TIME, value); } /** * 创建时间戳型值(包含日期和时间部分) * * @param value 字符串形式的值 * @return 一个时间戳类型的值 */ public static Value dateTimeValue(String value) { return new Value(DataType.DATE_TIME, value); } protected Value() { } private Value(DataType dataType, String value) { this.dataType = dataType; if (value != null) { this.value = value; } } /** * 获取数据类型 * @return 值所属的数据类型 */ public DataType getDataType() { return dataType; } /** * 获取原始字符串值 * @return 原始字符串值 */ public String getStringValue() { return value; } /** * 获取字符串值 * @return 字符串形式的值 */ public String getString() { return (String) DataType.STRING.getValue(value); } /** * 获取整数值 * @return 整数形式的值 */ public int getInt() { return (Integer) DataType.INT.getValue(value); } /** * 获取长整数值 * @return 长整数形式的值 */ public long getLong() { return (Long) DataType.LONG.getValue(value); } /** * 获取浮点数值 * @return 浮点数形式的值 */ public double getDouble() { return (Double) DataType.DOUBLE.getValue(value); } /** * 获取BigDecimal值 * @return BigDecimal形式的值。 */ public BigDecimal getBigDecimal() { return (BigDecimal) DataType.BIG_DECIMAL.getValue(value); } /** * 获取布尔值 * @return 布尔形式的值 */ public boolean getBoolean() { return (Boolean) DataType.BOOLEAN.getValue(value); } /** * 获取日期/时间值 * @return 日期形式的值 */ public Date getDate() { if (StringUtils.isBlank(value)) { return null; } try { return DateUtils.parseDateStrictly(value, DATE_TIME_FORMAT); } catch (ParseException e) { throw new RuntimeException(e); } } /** * 获得转换为相应数据类型的值 * @return 由原始字符串转换为相应数据类型的值。 */ public Object getValue() { return dataType.getValue(value); } @Override public int hashCode() { return new HashCodeBuilder().append(dataType).append(value).toHashCode(); } @Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof Value)) { return false; } Value that = (Value) other; return new EqualsBuilder() .append(this.getDataType(), that.getDataType()) .append(this.getStringValue(), that.getStringValue()) .isEquals(); } @Override public String toString() { return value; } }