ltree postgres type using spring data jpa -- 在定义函数并在 postgres 中转换后出现语法错误
ltree postgres type using spring data jpa -- geting syntax error after defining a function and cast within postgres
尝试写入包含 ltree 类型值的实体时,出现以下错误:
column "path" is of type ltree but expression is of type character varying
谷歌搜索那个错误让我 Macaddr/Inet type of postgres in slick
Craig Ringer 的回答让我开始了,虽然创建一个转换文本 -> ltree 没有用,所以我创建了一个转换 varchar -> ltree 如下
CREATE OR REPLACE FUNCTION ltree_invarchar(varchar) RETURNS ltree AS $$
SELECT ltree_in(::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 的新手,所以我通过修改我找到的答案中给出的函数来创建上面的函数,但现在我被卡住了。我需要帮助来确定语法错误是什么以及如何修复它。
我发现语法错误消息并没有告诉我 SQL 或函数有问题;它告诉我发送到函数的数据有问题。在我的例子中,我的 Java 代码中有一个错误,它发送了一个以“.”开头的路径,这是不允许的。修复 Java 代码中的错误解决了我的问题。
尝试写入包含 ltree 类型值的实体时,出现以下错误:
column "path" is of type ltree but expression is of type character varying
谷歌搜索那个错误让我 Macaddr/Inet type of postgres in slick
Craig Ringer 的回答让我开始了,虽然创建一个转换文本 -> ltree 没有用,所以我创建了一个转换 varchar -> ltree 如下
CREATE OR REPLACE FUNCTION ltree_invarchar(varchar) RETURNS ltree AS $$
SELECT ltree_in(::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 的新手,所以我通过修改我找到的答案中给出的函数来创建上面的函数,但现在我被卡住了。我需要帮助来确定语法错误是什么以及如何修复它。
我发现语法错误消息并没有告诉我 SQL 或函数有问题;它告诉我发送到函数的数据有问题。在我的例子中,我的 Java 代码中有一个错误,它发送了一个以“.”开头的路径,这是不允许的。修复 Java 代码中的错误解决了我的问题。