PostgresQL 字符串隱式轉換JSON腳本:
-- 隱式將varchar轉換為json
CREATE OR REPLACE FUNCTION json_in_varchar(varchar) RETURNS json AS $$
SELECT json_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
DROP CAST IF EXISTS (varchar as json);
CREATE CAST (varchar AS json) WITH FUNCTION json_in_varchar(varchar) AS IMPLICIT;
-- 隱式將varchar轉換為jsonb
CREATE OR REPLACE FUNCTION jsonb_in_varchar(varchar) RETURNS jsonb AS $$
SELECT jsonb_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
DROP CAST IF EXISTS (varchar as jsonb);
CREATE CAST (varchar AS jsonb) WITH FUNCTION jsonb_in_varchar(varchar) AS IMPLICIT;
package com.apress.spring.domain;
import java.io.IOException;
import java.util.List;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;;
/*
* */
@Converter
public class ListString2JsonConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatabaseColumn(List<String> attribute) {
if(attribute == null || attribute.size() == 0) return "[]";
ObjectMapper mapper = new ObjectMapper();
String json = null;
try {
json = mapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
@SuppressWarnings("unchecked")
@Override
public List<String> convertToEntityAttribute(String dbData) {
ObjectMapper mapper = new ObjectMapper();
List<String> list = null;
try {
list = (List<String>) mapper.readValue(dbData, List.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
/*
* 使用hibernate類型轉換
* SQL script:
* testdb=# create table testjson2(id serial, data json, answers jsonb, remain_balance decimal(19,6));
* */
@Entity
@Table(name = "testjson2")
public class Testjson2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// List轉換為String,數據庫中再轉換為JSON.
@Convert(converter = ListString2JsonConverter.class)
private List<String> answers;