sql >> Databáze >  >> RDS >> PostgreSQL

Jak namapovat org.postgresql.geometric.PGpoint na typ hibernace

Za prvé a především si myslím, že GEOMETRY datové typy jsou podporovány Hibernate Spatial , ale pokud tomu tak není, můžete vždy definovat vlastní typ hibernace a vlastní dialekt hibernace.

Měl jsem podobný problém při správě POINT sloupec, který obsahoval geografické body.

Vytvořil jsem PostgisDialect class, která rozšířila PostgreSQL9Dialect , kde tímto způsobem zaregistrujete nový datový typ

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

ve vašem případě byste typ zaregistrovali jako "geometrie"

poté definujete GeometryType třída, která implementuje UserType

Kupodivu proces psaní vlastního typu Hibernate není jednou z nejvíce zdokumentovaných funkcí, takže sem vložím to, co jsem napsal, abych definoval svůj PointType. Pro ostatní metody v rozhraní jsem je nechal vyvolat 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};
}    

}

několik rychlých poznámek:nullSafeSet a nullSafeGet zapisuje a čte hodnoty do/z databáze pomocí objektů BinaryWriter/BinaryParser.

Jakmile toto vše nadefinujete, takto označíte třídu modelu, aby používala váš vlastní typ

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

V neposlední řadě musíte říci Hibernate, aby používala váš vlastní dialekt. Pokud k definování továrny relací používáte Spring, můžete ji definovat pomocí hibernateProperties

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



  1. PHP zobrazit obrázek BLOB z MySQL

  2. Vypočítejte rozdíl mezi 2 daty/časy v Oracle SQL

  3. WHERE LIKE s více klíčovými slovy

  4. hromadné vkládání hodnot seznamu pomocí SQLAlchemy Core