sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan kortlægges org.postgresql.geometric.PGpoint til Hibernate Type

Først og fremmest tænker jeg GEOMETRY datatyper understøttes af Hibernate Spatial , men hvis de ikke er det, kan du altid definere en tilpasset dvaletype og en tilpasset dvaledialekt.

Jeg havde et lignende problem, da jeg administrerede et POINT kolonne, som indeholdt geografipunkter.

Jeg oprettede en PostgisDialect klasse, som udvidede PostgreSQL9Dialect , hvor du på denne måde registrerer den nye datatype

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

i dit tilfælde vil du registrere typen som "geometri"

derefter definerer du en GeometryType klasse, som implementerer UserType

Mærkeligt nok er processen med at skrive en brugerdefineret Hibernate Type ikke en af ​​de mest dokumenterede funktioner, så jeg vil indsætte her, hvad jeg skrev for at definere min PointType. For de andre metoder i grænsefladen lod jeg dem kaste 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};
}    

}

nogle hurtige noter:nullSafeSet og nullSafeGet skriver og læser værdierne til/fra databasen, henholdsvis ved hjælp af BinaryWriter/BinaryParser-objekterne.

Når du har defineret alt dette, er det sådan, du annoterer din modelklasse, så den bruger din tilpassede type

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

Sidst, men ikke mindst, skal du bede Hibernate om at bruge din tilpassede dialekt. Hvis du bruger Spring til at definere din sessionsfabrik, kan du definere den via hibernateProperties

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



  1. Vis det antal gange, en placering dukkede op i den respektive tabel, efter at den tilsvarende indstilling fra rullelisten blev valgt

  2. Hvordan kan jeg få en fejl, når jeg kører flere forespørgsler med PDO?

  3. Optimering af Oracle CONNECT BY, når det bruges med WHERE-sætning

  4. Django - postgres:Sådan opretter du et indeks på et JsonB-felt