org.postgresql.util.PSQLException:错误:运算符不存在:文本> =整数

时间:2019-07-27 03:43:08

标签: postgresql hibernate spring-boot jpa

在Spring Boot应用程序中,尝试查询JSONB类型的PostgreSQL DB表列。在Entity变量中将JSONB字段设置为Integer,但是它正以文本形式从DB中提取。当使用criteriaBuilder.between构建where条件时,将引发以下错误:

由以下原因引起:org.postgresql.util.PSQLException:错误:运算符不存在:文本> =整数   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

我尝试在变量声明中使用@Column(name =“(myjsonbcol->>'myField'):: INT”)。但这会在'('错误)上或之后引发无效的语法。

我还检查了JSONB中的myField是否存储为字符串(值未用引号引起来。)

MyEntity.java

/** myfield. */
@Column(name = "myjsonbcol->> 'myIntField'")
private Integer myIntField;

MyDAO.java

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyTableData> criteriaQuery = 
     criteriaBuilder.createQuery(MyTableData.class);
Root<MyTableData> root = criteriaQuery.from(MyTableData.class);
criteriaBuilder.between(root.get("myIntField"), startIntValue, 
                endIntValue));

以下查询在pgAdmin中可以正常工作

select (myjsonbcol ->> 'myField')::INT as myIntField 
from mytable
where  (myjsonbcol ->> 'myField')::INT > 0

基于JSONB列中的整数值字段,预期要过滤的结果。类似的“喜欢”过滤对于String变量也可以正常工作。

这里的问题是Hibernate形成的查询,为表添加了别名(示例:mytabledata0_),并且该表alaias的每一列都带有前缀(mytabledata0_.myjsonbcol->>'myIntField')。

@Column(name = "myjsonbcol->> 'myIntField'")

因此,如果我在列名中使用PostgreSQL的类型转换方式(例如:@Column(name =“ CAST(myjsonbcol->>'myIntField'AS INT)”))),它将在表之后应用选择该列时出现别名,并导致“错误:语法错误位于“或”附近”。

样本查询:     选择mytabledata0_.cast(myjsonbcol->>'myIntField'作为int)作为column1_2     来自mytable mytabledata0 _

如果表别名没有前缀或整个列都用括号括起来(例如:(mytabledata0_.cast(myjsonbcol->>'myIntField'as int))作为column1_2),则此解决方案将起作用。

我也尝试了@Column(name =“ myjsonbcol->>'myIntField':: INT”),它抛出错误“ org.postgresql.util.PSQLException:错误:整数的无效输入语法:” myIntField “”是由于相同的Hibernate查询形成问题。

当我尝试通过实现AttributeConverter接口创建新类TextToIntegerConverter并添加以下内容时,未报告任何错误。

@Column(name = "myjsonbcol->> 'myIntField'")
@Convert(converter = TextToIntegerConverter.class)
private Integer myIntField;

但是,当查询形成了在该PostgreSQL整数字段的范围之间寻找条件的位置标准时,则不会执行从文本到int的类型转换。示例查询在这里:

select mytabledata0_.myjsonbcol ->> 'myIntField' as column1_2
from mytable mytabledata0_
where mytabledata0_.myjsonbcol ->> 'myIntField' between '100' and '500'

因此,使用AttributeConverter / query的这种方法不会返回任何错误,也不会返回任何记录。

如果可以停止添加表别名前缀,或者用括号将列包装起来可能有助于解决此问题。但我仍在尝试寻找解决方案/解决方法。任何帮助是极大的赞赏。预先感谢。

0 个答案:

没有答案