sql >> データベース >  >> RDS >> PostgreSQL

org.postgresql.geometric.PGpointをHibernateタイプにマップする方法

    何よりもまず、GEOMETRYだと思います データ型は、 HibernateSpatial でサポートされています。 、ただしそうでない場合は、カスタムのHibernateタイプとカスタムのHibernate方言をいつでも定義できます。

    POINTを管理するときに同様の問題が発生しました 地理ポイントを含む列。

    PostgisDialectを作成しました PostgreSQL9Dialectを拡張したクラス 、この方法で新しいデータ型を登録します

    public PostgisDialect() {
        registerColumnType(Types.BINARY, "geography");        
    }
    

    あなたの場合、タイプを「ジオメトリ」として登録します

    次に、GeometryTypeを定義します UserTypeを実装するクラス

    奇妙なことに、カスタムHibernate Typeを作成するプロセスは、最も文書化された機能の1つではないため、PointTypeを定義するために作成したものをここに貼り付けます。インターフェイスの他のメソッドについては、UnsupportedOperationExceptionをスローさせます

    public class PointType implements UserType{
    private static final Type[] PROPERTY_TYPES = new Type[] { 
        StringType.INSTANCE };
    public String[] getPropertyNames() {
         return new String[] {"point"};   }
    
    public Type[] getPropertyTypes() {
        return PROPERTY_TYPES;
    }
    
    
    public Class returnedClass() {
       return Point.class;
    }
    
    public boolean equals(Object o, Object o1) throws HibernateException {
        if((o instanceof Point && o1 instanceof Point) == false)
            return false;
        Point p1 = (Point) o;
        Point p2 = (Point) o1;
        boolean equal = ((p1.getX() == p2.getX()) && (p1.getY() == p2.getY()));
        return equal;
    
    
    }   
    
    public Object nullSafeGet(ResultSet rs, String[] strings, SessionImplementor si, Object o) throws HibernateException, SQLException {
    // the method which gets the data from the column and converts it to a Point using       BinaryParser
       BinaryParser bp = new BinaryParser();       
       try{          
          String binaryString = rs.getString(strings[0]);
           return bp.parse(binaryString);
       }
       catch(Exception ex){ return null;}
    
    }
    
    public void nullSafeSet(PreparedStatement ps, Object o, int i, SessionImplementor si) throws HibernateException, SQLException {
        Point p = (Point) o ;
        if(p!=null){
           BinaryWriter bw = new BinaryWriter();
           ps.setObject(i,bw.writeBinary(p));      
        }
    
    public Object deepCopy(Object o) throws HibernateException {
        Point p = (Point) o;        
        Point newPoint = null;
        if(p!=null){
            newPoint = new Point(p.x, p.y);
            newPoint.setSrid(p.getSrid());
        }
        return newPoint;
    
    }
    
    public boolean isMutable() {
        return true;
    }
    
    
    public int[] sqlTypes() {
        return new int[]{Types.BINARY};
    }    
    

    }

    いくつかの簡単な注意:nullSafeSetとnullSafeGetは、BinaryWriter / BinaryParserオブジェクトを使用して、それぞれデータベースとの間で値の書き込みと読み取りを行います。

    これらすべてを定義したら、これがモデルクラスに注釈を付けてカスタムタイプを使用するようにする方法です

    @Column(name="point")
    @Type(type="eu.enricorampazzosoluzioni.incidentpredicter.dataCopier.hibernate.types.PointType")
    private Point point;
    

    最後になりましたが、カスタム方言を使用するようにHibernateに指示する必要があります。 Springを使用してセッションファクトリを定義する場合は、hibernatePropertiesを介して定義できます。

    <property name="hibernateProperties">
         <props>           
             <prop key="hibernate.dialect">eu.enricorampazzosoluzioni.incidentpredicter.dataCopier.hibernate.dialect.PostgisDialect</prop>            
         </props>
      </property>
    



    1. 集計関数で選択された行のIDを取得するにはどうすればよいですか?

    2. JDBIでIN演算子を使用するにはどうすればよいですか?

    3. Postgresに保存されているjsonbデータの構造を変更する方法

    4. 値が配列内にあるMySQLSELECTステートメント