提问者:小点点

ltree postgres类型使用Spring数据jpa--定义函数并在postgres中强制转换后出现语法错误


当尝试编写包含ltree类型值的实体时,我收到以下错误:

column "path" is of type ltree but expression is of type character varying

谷歌这个错误让我在滑头上找到了Macaddr/Inet类型的postgres

克雷格·林格的回答让我开始了,尽管他创造了一个演员文本——

CREATE OR REPLACE FUNCTION ltree_invarchar(varchar) RETURNS ltree AS $$
SELECT ltree_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
CREATE CAST (varchar AS ltree) WITH FUNCTION ltree_invarchar(varchar) AS IMPLICIT;

这让我忘记了最初的错误,但是现在当我尝试使用Spring Boot Starter Data JPA从Java中插入一个ltree值时,我得到了一个像这样结束的长堆栈跟踪:

Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at position 0
  Where: SQL function "ltree_invarchar" statement 1
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:135)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    at com.sun.proxy.$Proxy120.executeUpdate(Unknown Source)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 71 more

我是postgres的新手,所以我通过修改我找到的答案中给出的那些来创建上面的函数,但是现在我被卡住了。我需要帮助来识别语法错误是什么以及如何修复它。


共1个答案

匿名用户

我发现语法错误消息并没有告诉我我的SQL或函数有问题;它告诉我发送到函数的数据有问题。在我的例子中,我的Java代码中有一个错误,发送了一个以“.”开头的路径,这是不允许的。修复Java代码中的bug解决了我的问题。