PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách ánh xạ org.postgresql.geometric.PGpoint sang Loại ngủ đông

Đầu tiên và quan trọng nhất, tôi nghĩ GEOMETRY loại dữ liệu được hỗ trợ bởi Hibernate Spatial , nhưng nếu không, bạn luôn có thể xác định Kiểu ngủ đông tùy chỉnh và Phương ngữ ngủ đông tùy chỉnh.

Tôi đã gặp sự cố tương tự khi quản lý POINT cột chứa các điểm địa lý.

Tôi đã tạo một PostgisDialect lớp mở rộng PostgreSQL9Dialect , nơi bạn đăng ký kiểu dữ liệu mới theo cách này

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

trong trường hợp của bạn, bạn sẽ đăng ký loại là "hình học"

sau đó, bạn xác định một GeometryType lớp triển khai UserType

Thật kỳ lạ, quá trình viết Kiểu ngủ đông tùy chỉnh không phải là một trong những tính năng được ghi chép nhiều nhất, vì vậy tôi sẽ dán vào đây những gì tôi đã viết để xác định PointType của mình. Đối với các phương thức khác trong giao diện, tôi để chúng ném 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};
}    

}

một số ghi chú nhanh:nullSafeSet và nullSafeGet lần lượt ghi và đọc các giá trị đến / từ cơ sở dữ liệu bằng cách sử dụng các đối tượng BinaryWriter / BinaryParser.

Khi bạn đã xác định tất cả những điều này, đây là cách bạn chú thích lớp mô hình của mình để nó sử dụng kiểu tùy chỉnh của bạn

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

Cuối cùng, nhưng không kém phần quan trọng, bạn cần yêu cầu Hibernate sử dụng phương ngữ tùy chỉnh của bạn. Nếu bạn sử dụng Spring để xác định nhà máy phiên của mình, bạn có thể xác định nó thông qua hibernateProperties

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi thả cơ sở dữ liệu postgres:pq:không thể thả cơ sở dữ liệu hiện đang mở

  2. Sequelize.js:Truy vấn không có trong mảng ($ ne cho các mục trong mảng)

  3. PostgreSQL:sắp xếp theo cột, với giá trị KHÔNG ĐẦY ĐỦ cụ thể CUỐI CÙNG

  4. Tìm kiếm cấu trúc EAV phù hợp dựa trên jsonb

  5. Liệt kê các bảng trong một lược đồ PostgreSQL