有没有人通过Hibernate成功地将PostgreSQL中的数值数组映射到java中的数值数组?
SQL:
CREATE TABLE sal_emp (name text, pay_by_quarter integer[]);
INSERT INTO sal_emp VALUES ('one', '{1,2,3}');
INSERT INTO sal_emp VALUES ('two', '{4,5,6}');
INSERT INTO sal_emp VALUES ('three', '{2,4,6}');
Run Code Online (Sandbox Code Playgroud)
制图:
<hibernate-mapping>
<class name="SalEmp" table="sal_emp">
<id name="name" />
<property name="payByQuarter" column="pay_by_quarter" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
类:
public class SalEmp implements Serializable{
private String name;
private Integer[] payByQuarter;
...// getters & setters
}
Run Code Online (Sandbox Code Playgroud)
查询表格时出现异常.
这是我的PostgreSQL函数:
salvarArquivoGeometricoCasoZeroPOINT
(dimensao text,tableName text,tuplas text[],srid text)
Run Code Online (Sandbox Code Playgroud)
它有一个text[]参数,我想String[]从我的JPQL 传递一个Java :
public String salvarGeometriaCaso0(String[] tuplas,FileDto arquivo){
Query query =
em().createNativeQuery("select
salvarArquivoGeometricoCasoZeroPOINT(?1,?2,?3,?4)");
query.setParameter(1,arquivo.getGeo());//String
query.setParameter(2,arquivo.getTable());/String
query.setParameter(3,tuplas);//String[]
query.setParameter(4,arquivo.getSrid());//String
return (String) query.getSingleResult();//function returns a Text, so cast to String
}
Run Code Online (Sandbox Code Playgroud)
上面的代码失败,但有异常:
ERROR] Internal Exception: org.postgresql.util.PSQLException: Can not infer a SQL
type to use for an instance of [Ljava.lang.String;.
Use setObject () with an explicit Types value to specify the type to use.
Run Code Online (Sandbox Code Playgroud)
所以我不确定如何从EclipseLink调用我的函数.
我正在使用Hibernate并Postgres定义了一个character(1)[]列类型.
所以我不知道如何让它criteria在数组中找到一个值.
喜欢这个查询
SELECT * FROM cpfbloqueado WHERE bloqueados @> ARRAY['V']::character[]
Run Code Online (Sandbox Code Playgroud) 虽然这个标题存在一些问题,但我的查询没有从这些线程中解决。
我在 postgres 中通过 hibernate 执行递归(使用 with 子句)查询,查询的结果也包含搜索路径
例如:一行查询结果
5811;"axyz_3_3";"ABC";5782;5811;5797;4;"**{acl_3_3,acl3_4,acl3,acl_3_3}**";t;t
Run Code Online (Sandbox Code Playgroud)
hibernate 是否有"{acl_3_3,acl3_4,acl3,acl_3_3}"除 String 之外的任何映射类型,类似于CHARACTER_ARRAY或CHAR_ARRAY。
以下是查询输出的示例
id |name|discri|pId|asscID|immeId|depth|path|cycle|canDelete
5797;"abc3";"abc";5782;5811;5788;7;"{abc_3_3,abc3_4,abc3,abc4}";t;f
5797;"abc3";"abc";5782;5786;5813;6;"{abc1,abc2,abc3,abc3}";t;f
5799;"abc4";"abc";5782;5811;5786;6;"{abc_3_3,abc3_4,abc4}";t;f
5788;"abc2";"abc";5782;5811;5786;6;"{abc_3_3,abc3_4,abc2}";f;f
5786;"abc1";"abc";5782;5786;5799;5;"{abc1,abc2,abc3,abc1}";t;f
5797;"abc3";"abc";5782;5786;5813;5;"{abc1,abc2,abc3,abc3}";t;f
5813;"abc3_4";"abc";5782;5786;5811;5;"{abc1,abc2,abc3_4}";f;f
5786;"abc1";"abc";5782;5811;5799;5;"{abc_3_3,abc4,abc1}";f;f
5813;"abc3_4";"abc";5782;5811;5797;4;"{abc3_4,abc3,abc3_4}";t;f
5811;"abc_3_3";"abc";5782;5811;5797;4;"{abc_3_3,abc3,abc_3_3}";t;t
5799;"abc4";"abc";5782;5811;5797;4;"{abc3,abc4}";f;f
Run Code Online (Sandbox Code Playgroud)
Hibernate 抛出以下异常
Caused by: com.vik.prod.service.UnidentifiedException: No Dialect mapping for JDBC type: 2003
at com.vik.prod.service.ServiceExecutorUtils.execute(ServiceExecutorUtils.java:93)
at com.vik.prod.service.ServerServiceExecutor.execute(ServerServiceExecutor.java:76)
at com.vik.prod.service.ClientDelegate.execute(ClientDelegate.java:197)
... 33 more
Run Code Online (Sandbox Code Playgroud)
引起:org.hibernate.MappingException:JDBC 类型没有方言映射:2003
我提出这个请求没有问题:
select ac.reg, param.alias, array_agg(numValue)
from Sample
group by ac.reg, param.alias
order by ac.reg ASC
Run Code Online (Sandbox Code Playgroud)
现在,我想要的不仅仅是平均值。如何将所有值作为数组获取?我使用 postgresql 作为数据库,我知道有一个 array_agg 方法可以返回我想要的确切内容。但是这种聚合似乎没有在休眠中实现。
select ac.reg, param.alias, array_agg(numValue)
from Sample
group by ac.reg, param.alias
order by ac.reg ASC
Run Code Online (Sandbox Code Playgroud)
引发异常:
A java.lang.IllegalStateException has been caught, No data type for node: org.hibernate.hql.ast.tree.MethodNode
\-[METHOD_CALL] MethodNode: '(' +-[METHOD_NAME] IdentNode: 'array_agg' {originalText=array_agg} \-[EXPR_LIST] SqlNode: 'exprList' \-[DOT] DotNode: 'sample0_.num_value'
{propertyName=numValue,dereferenceType=ALL,propertyPath=numValue,path={synthetic-alias}.numValue,tableAlias=sample0_,className=models.Sample,classAlias=null} +-[IDENT] IdentNode: '{synthetic-alias}' {originalText={synthetic-alias}} \-[IDENT] IdentNode: 'numValue' {originalText=numValue}
Run Code Online (Sandbox Code Playgroud) postgresql ×5
hibernate ×4
java ×2
arrays ×1
criteria ×1
eclipselink ×1
jpa ×1
jpa-2.0 ×1
jpql ×1
sql ×1