- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 JPA 为 Postgres 数据库中的 JSONB 列创建查询。查询与 Postgres JSON Documentation 中的示例非常相似:
-- Find documents in which the key "company" has value "Magnafone"
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"company": "Magnafone"}';
其中 jdoc
是表 api
中的 JSONB 列。
到目前为止,执行此查询很容易,没有问题。但是,如果我尝试参数化查询,我就会卡住。
以下是我尝试过的一些查询:
1) 这不起作用,因为 ?在'-符号之间无法识别:
String name= "Magnafone";
JPA.em().createNativeQuery("SELECT jdoc FROM api
WHERE jdoc @> '{\"name\": ?}'", Record.class)
.setParameter(1, name)
错误:
play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal p
arameters. Remember that ordinal parameters are 1-based! Position: 2]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.3.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at scala.Option.map(Option.scala:145) [scala-library-2.10.3.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:2.2.3]
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordin
al parameters are 1-based! Position: 2
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:451) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at models.lol.player.IPlayer.getPlayerByName(IPlayer.java:22) ~[na:na]
at controllers.LoadTeamController.loadTeamData(LoadTeamController.java:23) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:57) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:57) ~[na:na]
Caused by: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position:
2
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:80) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Fina
l]
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:86) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Fi
nal]
at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:450) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:422) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:445) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]</code>
2) 我在另一个 SO-Thread 中找到了这个。虽然不起作用,因为 ||出现在查询中并抛出 SQL 异常。
JPA.em().createNativeQuery("SELECT jdoc FROM api
WHERE jdoc @> '{\"name\": ' || :name ||'}'", Record.class)
.setParameter("name", name)
错误:
play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal p
arameters. Remember that ordinal parameters are 1-based! Position: 2]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.3.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at scala.Option.map(Option.scala:145) [scala-library-2.10.3.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:2.2.3]
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordin
al parameters are 1-based! Position: 2
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:451) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at models.lol.player.IPlayer.getPlayerByName(IPlayer.java:22) ~[na:na]
at controllers.LoadTeamController.loadTeamData(LoadTeamController.java:23) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:57) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:57) ~[na:na]
Caused by: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position:
2
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:80) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Fina
l]
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:86) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Fi
nal]
at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:450) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:422) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:445) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
我尝试了其他一些让 Postgres 或 JPA 以某种方式抛出的东西,并且在使用 JPA 的参数化时没有设法获取 JSON 参数。
3)
JPA.em().createNativeQuery("SELECT jdoc FROM api
WHERE jdoc @> '{\"name\": ' || ? ||'}'", Record.class)
.setParameter(1", name)
错误:
play.api.Application$$anon$1: Execution exception[[PersistenceException: org.hibernate.exception.DataException: FEHLER: ung³ltige Eingabesyntax f³r Typ json
Detail: Die Eingabezeichenkette endete unerwartet.
Position: 62
Where: JSON-Daten, Zeile 1: {"name": ]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.3.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:
2.2.3]
at scala.Option.map(Option.scala:145) [scala-library-2.10.3.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.3.jar:2.2.3]
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.DataException: FEHLER: ung³ltige Eingabesyntax f³r Typ json
Detail: Die Eingabezeichenkette endete unerwartet.
Position: 62
Where: JSON-Daten, Zeile 1: {"name":
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:266) ~[hibernate-entitymanager-4.1.8.Final.jar:4.1.8.Final]
at models.lol.player.IPlayer.getPlayerByName(IPlayer.java:24) ~[na:na]
at controllers.LoadTeamController.loadTeamData(LoadTeamController.java:23) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:57) ~[na:na]
Caused by: org.hibernate.exception.DataException: FEHLER: ung³ltige Eingabesyntax f³r Typ json
Detail: Die Eingabezeichenkette endete unerwartet.
Position: 62
Where: JSON-Daten, Zeile 1: {"name":
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:134) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final
]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) ~[hibernate-core-4.1.8.Final.jar:4.1.8.
Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) ~[hibernate-core-4.
1.8.Final.jar:4.1.8.Final]
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) ~[hibernate-core-4.1.8.Final.jar:4.1.8.Final]
Caused by: org.postgresql.util.PSQLException: FEHLER: ung³ltige Eingabesyntax f³r Typ json
Detail: Die Eingabezeichenkette endete unerwartet.
Position: 62
Where: JSON-Daten, Zeile 1: {"name":
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) ~[postgresql-9.2-1003-jdbc4.jar:na]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) ~[postgresql-9.2-1003-jdbc4.jar:na]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) ~[postgresql-9.2-1003-jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) ~[postgresql-9.2-1003-jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) ~[postgresql-9.2-1003-jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302) ~[postgresql-9.2-1003-jdbc4.jar:na]
仅供引用:这有效(别担心,我没有使用它):
JPA.em().createNativeQuery("SELECT jdoc->'guid', jdoc->'name' FROM api
WHERE jdoc @> '{\"company\": \""+company+"\"}'", Record.class)
此外:我正在使用 createNativeQuery
,因为 JPA 无法识别 @>
-Operator。
谢谢。
蒂莫
最佳答案
pozs 将答案作为评论发布:
Try "... WHERE jdoc @> cast('{\"company\":' || to_json(cast(? as text)) || '}' as json)" (or jsonb at the last cast, if that's appropriate).
关于java - JPA 查询 Postgres 中的 JSONB 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28284997/
我有一个 Postgres 表,mytable 其中一个字段如下: myField JSONB[] NOT NULL 让我们假设上述 json 是这种形式: { "字母":"A", "数字":30}
在 PostgreSQL 的一个 jsonb 字段中保存多个地址是个好主意。我是 nosql 的新手,我想测试 PostgreSQL 来做到这一点。我不想有另一个包含地址的表,我更喜欢将它放在同一个表
我得到了带有 jsonb 的字段 tags: [{"value": "tag1"}] 我需要做这样的事情 update table1 set tags = tags - '{"value": "tag
我使用 postgres9.4,并且存在关系“Patients”具有类型为 jsonb[] 的列“contact”,如何传输类型 jsonb[ ] 到 jsonb? 记录如下。 =>select na
我正在尝试使用以下查询基于 jsonb 字段中的多个 json 属性将 jsonb 字段更新到表中 insert into testtable(data) values('{ "key": "
我有列 options 类型为 jsonb ,格式为 {"names": ["name1", "name2"]} 是用 创建的 UPDATE table1 t1 SET options = (SELE
我在其中一个项目中使用 Postgres 数据库。现在我需要将 JSON 数组存储在数据库中。如下所示: 例如,我有以下 JSON 结构: [ { "Id": 1, "Name":
我正在尝试从 postgre 表中读取一个 jsonb 字段。我尝试通过以下方式使用 Jsonb 库将其作为 Jsonb 类型读取: @Entity @Table(name = "test") dat
tl;dr -- 有什么方法可以从 postgres 中的 jsonb 对象获取值作为 jsonb_array 吗? 尝试在 postgres 中使用递归 cte 来展平任意深度的树结构,如下所示:
给定类似于以下的现有数据结构: CREATE TEMP TABLE sample (id int, metadata_array jsonb, text_id_one jsonb, text_id_t
psql --version psql (PostgreSQL) 9.4.1 rails -v Rails 4.2.0 我通过这样的迁移添加了一个 jsonb 列 class AddPreferenc
假设我有一个模型 Neighborhood,它有一个 jsonb[] 字段 families,它是一个包含 json 对象的数组,具有任何类型的键值对,如下所示 [{"name":"Smiths",
我在这里显示了以下数据集 http://sqlfiddle.com/#!17/f9280/1 我想查询数据的方式是每个键和类别的平均排名 例如, 键 1,类别 10,avg_rank:95 键 1,类
我在 springboot(2.1)+postgres(10.5)+hibernate(5.3.7) 中使用 jsonb。 以下是文件中的更改: 在 pom.xml 中 .... com.vladm
考虑像下面这样的模型和一个 bars 的 json 数组: const myModel = { id: 1, bars: [ { aproperty: 10 },
friend 们好,我需要帮助来解决以下问题, 我在我的 postgres 数据库表中有一组记录,其中表有 JSONB 类型字段。 JSONB 类型列包含以下JSON, 记录#1 :- { "ke
我有一个表,其中 JSONB 列存储 JSONB 数组/字符串(下例中的 value_r 列)。仅对 JSONB 列中的 JSONB 数组的内容进行排序(还存储字符串)的最简单(且有效)的方法是什么?
在 PostgreSQL 9.5 表中,我有一个 integer 列 social。 当我尝试在存储过程中更新它时,在jsonb 类型的 in_users 变量中给定以下 JSON 数据(一个包含 2
我有一个专栏amount_splits我需要按照我指定的键顺序保存我的 JSON。 如何防止 Rails/Postgres jsonb当我将它保存到数据库时自动排序我的 JSON 键? (用于创建或更
我想使用 UNION ALL 运算符将 2 个表合并为一个表。第一个表有几个字段。第二个表将几个字段分组到 JSONB 字段上。 为了简化问题,我使用这个简单的 SQL 请求(不依赖于表)重现了错误:
我是一名优秀的程序员,十分优秀!