在Hibernate中映射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 )
获取以下错误:
表[relation]中列[org_path]中遇到错误的列类型; 找到[“schemaName”。“ltree”(Types#OTHER)],但期待[ltree(Types#VARCHAR)]
任何人都可以帮助如何解决这个问题?
在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;
我已经适合,直到我也创建了一个LQueryType就像为LTreeType提供类@arnabbiswas。 我的代码只知道字符串,但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>