Spring Boot JPA: как сопоставить поле со столбцом, тип данных которого не фиксирован - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть класс сущности с двумя полями.

@Entity(name = "additional_attributes")
class AdditionalAttributes {

  @Id
  private Integer id;
  private String attributeName;
  private Object attributevalue;

  // getter and setter
  // manytoone with mandatory table

}

Тип данных attributeValue здесь Object, что означает, что значение может быть любым, например, целое число / логическое значение / число с плавающей запятой.

Как обработать этот сценарий, чтобы сохранить правильное значение, и снова при получении я должен получить точное значение (которое было типа boolean / integer et c) ??

1 Ответ

1 голос
/ 14 февраля 2020

Вы должны добавить attribute поле маркера класса Class<?> attributeClass. Другой подход заключается в создании enum AttributeType и использовании его в качестве поля маркера

@Entity(name = "additional_attributes")
class AdditionalAttributes {

  @Id
  private Integer id;
  private String attributeName;

  Class<?> attributeClass;
  String attributevalue;

  public void setAttribute(Object attribute){
      attributeClass = attribute.getClass()
      attributevalue = attribute.toString();
  }
}

Для установки атрибута используйте это:

Integer integerAttribute = 100;
additionalAttributes.setAttribute(integerAttribute);

Boolean booleanAttribute = true;
additionalAttributes.setAttribute(booleanAttribute);

, и тогда есть два подхода:

1) Добавить к общему объекту или классу обслуживания attribute parcer

public Object getAttribute() throws NumberFormatException {
      if(attributeClass == Integer.class) {
          return Integer.parseInt(attributevalue);
      }

      if(attributeClass == Boolean.class) {
          return Boolean.parseBoolean(attributevalue);
      }

      //...
}

Использование:

Object attribute = additionalAttributes.getAttribute();  

2) Или используйте пару методов, чтобы получить attribute

public boolean isIntegerAttribute() {
   return attributeClass == Integer.class;
}

public Integer getIntegerAttribute() throws NumberFormatException {
   return Integer.parseInt(attributevalue);
}  

public boolean isBooleanAttribute() {
   return attributeClass == Boolean.class;
}

public Boolean getBooleanAttribute() {
   return Boolean.parseBoolean(attributevalue);
}    

//...

Использование:

if(additionalAttributes.isIntegerAttribute()) {
    Integer integerAttribute = additionalAttributes.getIntegerAttribute(); 
    //...
}

if(additionalAttributes.isBooleanAttribute()) {
    Boolean booleanAttribute = additionalAttributes.getBooleanAttribute(); 
    //...
}
...