2017-08-18 24 views
0

PostgreSQLに2つのカラム(Idとcoord)を持つテーブルがあります。 カラム "coord" - JSONフォーマットの文字列として保存されたジオ座標。PostgreSQLの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リクエスト)のような文字列を送信する方法。私はPostgreにJSONとしてCOORDをstoreing場合

エンティティゲッターとセッター

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形式を扱う傾けます。誰かが簡単な方法を知っているかもしれません。 Postgres jsonタイプで作業するための独自のクラスを作成しないでください

+1

それはあなたが実際に求めているものを非常に明確です。どのように解析するのですか? AJAX経由での送信方法私たちが問題を理解できるように、すでに試したことのコードがありますか? – JCooke

+0

私の質問が更新されました。すべて正しいです。しかし、あなたが見ることができるように、答えは です。tplnr: "String"、coord: "String"。 json配列としてcoordを送る必要があります。 – Eugene

答えて

0

Hibernateを使用しているので、jsonの処理方法を知っているカスタムUserTypeを使用するとよいでしょう。

  1. 休止ユーザータイプ

    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; 
        } 
    
    } 
    
  2. あなたEntity.java

    @Type(タイプ= "あなたのGeoJsonTypeにFQN")=「地理

    @Column(名前を作成")

    public GeoEntity getGeo()

    {

    return geo;

    }

+0

ありがとう!しかし、postgresqlのJSON処理関数でも同じことができますか? クエリー= this.em.createNativeQuery( "CREATEタイプjson_type AS(小数点以下10桁);" + "SELECT tplnr、(json_array_elements(coord))。* FROM Lepcoord"); – Eugene

+0

もちろん、移植性を失うことはできますが、Hibernate postgresqlDialectを拡張しない限り、HQLを失い、ネイティブクエストのみを使用する必要があります。 –