我在PostgreSQL中有一个包含2列的表--Id和coord。 专栏" coord" - 以JSON格式存储为字符串的地理坐标。
示例:
[{"lat":49.09693425316379,"lng":33.61747393628419},{"lat":49.11835977646441,"lng":33.638456496907},{"lat":49.12103137811804,"lng":33.63866144845382},{"lat":49.09694682809236,"lng":33.61746879914138},{"lat":49.08920750204137,"lng":33.61734796797724},{"lat":49.07643862058337,"lng":33.61246117651179}]
如何发送此类字符串作为JSON对象数组(POST请求)。
没有getter和setter的实体
public class Lepcoord implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 30)
@Column(name = "tplnr")
private String tplnr;
@Size(max = 2147483647)
@Column(name = "coord")
private String coord;
控制器
@POST
@RequestMapping(value= "/lep/{voltage}", method = RequestMethod.POST, headers = "Accept=application/json")
@ResponseBody
public ResponseEntity<List<Lepcoord>> lep (@PathVariable String voltage)
{
return new ResponseEntity<>(gisDaoService.lep(voltage), HttpStatus.OK);
}
服务
@Transactional(readOnly = true)
public List <Lepcoord> lep (String voltage) {
Query query = this.em.createQuery(
" From Lepcoord ");
List <Lepcoord> rez = null;
try {
rez = (List<Lepcoord>) query.getResultList();
} catch (PersistenceException r) {
return null;
}
return rez;
}
Hibernate无法处理json类型如果我将coord存储为Postgre中的json。可能有人知道更简单的方法。不要编写自己的类来使用Postgres json类型
答案 0 :(得分:0)
Postgres支持这里应该有用的json_to_array
函数。在这里查看documentation。
或者,SO上有这个答案:How to turn a json array into rows in postgres可以指向正确的方向。
答案 1 :(得分:0)
您正在使用Hibernate,因此最好使用知道如何处理json的自定义UserType。
创建一个hibernate usertype
public class GeoJsonType implements UserType
{
protected static final int[] SQL_TYPES = { java.sql.Types.VARCHAR };
@Override
public int[] sqlTypes()
{
return SQL_TYPES;
}
@Override
public Class returnedClass()
{
return GeoEntity.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException
{
if (x == y)
{
return true;
}
else if (x == null || y == null)
{
return false;
}
else
{
return x.equals(y);
}
}
@Override
public int hashCode(Object x) throws HibernateException
{
return x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
{
// if (rs.wasNull())
// {
// return null;
// }
//this is your json stored in db
String rsArr = rs.getString(names[0]);
if (rsArr == null)
return null;
GeoEntity detailAttr = JSON.toObject(rsArr, GeoEntity.class, null);
return detailAttr;
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
{
if (value == null)
{
st.setNull(index, SQL_TYPES[0]);
}
else
{
//when stroing object into db convert it to json
GeoEntity castObject = (GeoEntity) value;
String json = JSON.toJson(castObject);
st.setString(index, json);
}
}
@Override
public Object deepCopy(Object value) throws HibernateException
{
return value;
}
@Override
public boolean isMutable()
{
return true;
}
@Override
public Serializable disassemble(Object value) throws HibernateException
{
return null;
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException
{
return null;
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException
{
return original;
}
}
您的Entity.java
@Type(type =&#34; FQN到您的GeoJsonType&#34;)
@Column(name =&#34; geo&#34;)
public GeoEntity getGeo()
{
返回地理位置;
}