2017-03-08 417 views
0

我在mysql中有一個類型爲「text」的字段,並在其中存儲了json數據。例如: - 「[」android_app「,」iphone_app「,」windows_app「]」;MySql Json對象反序列化優化

我使用hibernate與mysql進行交互,並在閱讀此字段時將其反序列化爲Java中的ArrayList。

我的問題是,這是處理這種情況的最好和最快的方式,或者有一些更好的方法來做到這一點。

+0

可能重複[檢查一個值是否存在於mysql中的json encode數組中](http://stackoverflow.com/questions/41132714/check-if-a-value-exists-in-json-encode-array-在MySQL的) – e4c5

回答

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 
    } 
} 

最好的部分是這將成爲一個可重用的組件,你可以簡單地將你需要的地方代表一個JSON數組作爲一個List<>你java類,但寧願將其作爲JSON存儲在數據庫中使用單個文本字段。

另一種替代方法是避免將數據存儲爲JSON,而是使用真正的表格,以便實際查詢JSON值。要做到這一點,你會使用JPA的@ElementCollection

@ElementCollection 
private List<String> textValues; 

內部,Hibernate的創建,它存儲的文本字符串值與參考所屬的實體的主鍵,在該實體的陣列中的輔助表重寫映射主鍵和字符串值被視爲該次表的PK。

因此,或者處理序列化List<>在控制器/業務代碼一個JSON陣列,以避免與介質類型,特別是考慮到大多數數據庫還沒有出臺一個真正的JSON數據類型尚未:)混合持久性。