2016-12-22 20 views
0

におけるPostgreSQLのltreeは列をマッピングするときに、私は次のように休止状態にある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

私もちょうどLTreeTypeのために提供されるクラスの@arnabbiswasようLQueryTypeを作成するまで、私はフィットしていた。私のコードは文字列についてしか知りませんが、Postgresはltreeを文字列と共に使う方法を知らない。種類と操作は次のとおりです。

ltree ~ lquery 
ltree @> ltree 

だから私のKotlin 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>