MySql Json对象反序列化优化

时间:2017-03-08 08:46:39

标签: java mysql hibernate

我在mysql中有一个类型为“text”的字段,并在其中存储json数据。 例如: - “[”android_app“,”iphone_app“,”windows_app“]”;

我正在使用hibernate与mysql进行交互,在阅读这个字段时,我将它反序列化为Java中的arraylist。

我的问题是,这是处理此类案件的最佳和最快的方式,还是有更好的方法。

1 个答案:

答案 0 :(得分:0)

如果您能够利用某些JPA 2.1功能,则可以使用AttributeConverter自动处理此问题,而无需在业务代码中处理此问题。

public class YourEntity {
  // other stuff
  @Convert(converter = StringArrayToJsonConverter.class)
  List<String> textValues;
}

然后您只需按如下方式定义转换器:

public class StringArraytoJsonConverter 
  implements AttributeConverter<List<String>, String> {

  @Override
  public string convertToDatabaseColumn(List<String> list) {
    // convert the list to a json string here and return it
  }

  @Override
  public List<String> convertToEntityAttribute(String dbValue) {
    // convert the json string to the array list here and return it
  }
}

最好的部分是,这成为一个可重用的组件,您只需将您需要的任何位置放在您的java类中作为List<>表示json数组,而宁愿将其作为JSON存储在数据库中使用单个文本字段。

另一种替代方法是避免将数据存储为JSON,而是使用真实表,它允许您实际查询JSON值。为此,您需要使用JPA的@ElementCollection

重写该映射
@ElementCollection
private List<String> textValues;

在内部,Hibernate创建一个辅助表,它存储数组的文本字符串值,并引用拥有实体的主键,其中实体主键和字符串值被视为此辅助表的PK。

然后,您可以处理序列化List<>作为控制器/业务代码中的JSON数组,以避免将持久性与该类型的介质混合,特别是考虑到大多数数据库尚未引入真正的JSON数据类型:)。