使用 javax.persistence 查询时,不能在数组运算符上使用 && 或 <@



我有以下表格结构。

CREATE TABLE IF NOT EXISTS posts(
postid SERIAL NOT NULL,
owner SERIAL NOT NULL,
title VARCHAR(100) UNIQUE NOT NULL,
message VARCHAR(500) NOT NULL,
continent VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL,
state VARCHAR(100) NOT NULL,
languages VARCHAR(100)[] NOT NULL,
properties varchar(100) ARRAY NOT NULL,
PRIMARY KEY (postid),
FOREIGN KEY (owner) REFERENCES users(userid) ON DELETE CASCADE
);

我有org.javax.persistence 1.0.0.Final

基本上,我要做的是使用类型为javax.persistence.Query的实体管理器运行以下查询


final Query query = em.createNativeQuery("SELECT postid FROM posts WHERE :properties <@ cast(properties as text[])");
query.setParameter("properties",propAux);

我得到的错误如下:org.postgresql.util.PSQLException:error:无法将类型byta强制转换为text[]位置:44

我不知道我的hibernate版本是否相关,但它是5.1.4.Final(不过我不认为是,请注意,我使用的是javax.persistence的entityManager,而不是org.hibernate(然而,如果它是相关的,我的hibernate方言是:org.hibernate.方言.PostgreSQL 92方言

我试着这样修复它:

final Query query = em.createNativeQuery("SELECT postid FROM posts WHERE :country = country AND cast(:properties as text[]) <@ cast(properties as text[])");
query.setParameter("properties", new TypedParameterValue(StringArrayType.INSTANCE,propAux));

之后我得到了以下错误:

org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003

hibernate生成的查询是:

SELECT * FROM posts WHERE country = ? AND cast(? as text[]) <@ cast(properties as text[]) limit ? 

我在psql中尝试过填充?'s,它起了作用。但问题是,我不知道我的代码到底在用什么来填充它们。这可能是问题的原因,但我不知道。

提前谢谢。

如果要使用TypedValue方法,则必须使用类似于Hibernate Types项目的自定义类型:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/

传入字符串并将其强制转换为数组也是一种选择,尽管正如您所设想的那样。

最新更新