2016-12-22 44 views
0

我試圖在Hibernate映射PostgreSQL的ltree列如下:得到錯誤的Hibernate映射PostgreSQL的LTREE列時

在實體: 私人字符串路徑;

@Column(name="org_path", columnDefinition="ltree") 
public String getPath() { 
    return path; 

Table structure: 
CREATE TABLE relationship (
    relationship_id int4 NOT NULL, 
    parent_organization_id uuid NOT NULL, 
    child_organization_id uuid NOT NULL, 
    org_path ltree NOT NULL, 
    CONSTRAINT relationship_pk PRIMARY KEY (relationship_id), 
    CONSTRAINT organization_fk3 FOREIGN KEY (parent_organization_id) REFERENCES organization(organization_id) ON DELETE RESTRICT ON UPDATE RESTRICT, 
    CONSTRAINT organization_fk4 FOREIGN KEY (child_organization_id) REFERENCES organization(organization_id) ON DELETE RESTRICT ON UPDATE RESTRICT 
) 

得到以下錯誤:

在柱中遇到錯誤的列類型[org_path]在表[關係];找到[「SCHEMANAME」。 「ltree」(類型#除外)],但期待[ltree(類型#VARCHAR)

誰能幫助如何解決這個問題呢?

回答

3

用Java實現自定義LTreeType類如下:

public class LTreeType implements UserType { 

    @Override 
    public int[] sqlTypes() { 
     return new int[] {Types.OTHER}; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public Class returnedClass() { 
     return String.class; 
    } 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     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 { 
     return rs.getString(names[0]); 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index) 
      throws HibernateException, SQLException { 
     st.setObject(index, value, Types.OTHER); 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     return new String((String)value); 
    } 

    @Override 
    public boolean isMutable() { 
     return false; 
    } 

    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable)value; 
    } 

    @Override 
    public Object assemble(Serializable cached, Object owner) 
      throws HibernateException { 
     return cached; 
    } 

    @Override 
    public Object replace(Object original, Object target, Object owner) 
      throws HibernateException { 
     // TODO Auto-generated method stub 
     return deepCopy(original); 
    } 

} 

和註釋的實體類,如下所示:

@Column(name = "path", nullable = false, columnDefinition = "ltree") 
    @Type(type = "LTreeType") 
    private String path; 
0

我不得不配合,直到我還創建了一個LQueryType就像提供LTreeType類@arnabbiswas。我的代碼只知道字符串,但Postgres不知道如何在字符串中使用ltree。該類型和操作是:

ltree ~ lquery 
ltree @> ltree 

所以我科特林JPA是這樣的:

val descendantIds = treeRepo.findAllDescendantIds("*.$id.*{1,}") 
. . . 
@Query(
    "SELECT node_id FROM tree WHERE path ~ CAST(:idQuery AS lquery);" 
    , nativeQuery = true) 
fun findAllDescendantIds(@Param("idQuery") idQuery: String): Array<Long>