Java Postgres中JSONB列的JPA查询

Java Postgres中JSONB列的JPA查询,java,hibernate,postgresql,jpa,Java,Hibernate,Postgresql,Jpa,我正在尝试使用JPA为Postgres DB中的JSONB列创建一个查询。查询将非常类似于以下示例: 其中jdoc是表api中的JSONB列 到目前为止,执行这个查询很容易,也不是问题。然而,如果我试图参数化查询,我就卡住了 以下是我尝试过的几个问题: 1) 这不起作用,因为?在以下符号之间无法识别: String name= "Magnafone"; JPA.em().createNativeQuery("SELECT jdoc FROM api WHERE jdoc @> '{\"n

我正在尝试使用JPA为Postgres DB中的JSONB列创建一个查询。查询将非常类似于以下示例:

其中
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>
    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]
    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]
2) 我在另一个SO线程中发现了这个。但不起作用,因为| |出现在查询中并引发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]</code>
    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]
    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]
我尝试过其他一些方法,这些方法让Postgres或JPA以某种方式呕吐,但在使用JPA的参数化时,没有成功获取JSON参数

(三)

错误:

    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>
    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]
    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]
仅供参考:这很有效(别担心,我没有使用它):

另外:我正在使用
createNativeQuery
,因为JPA无法识别
@>
-运算符

谢谢


蒂莫

pozs将答案作为评论发布:

尝试“…WHERE jdoc@>cast(“{\”company\”:“| | | | to_json(cast(?as text))| | | |}”as json)”(或者在最后一次cast时使用jsonb,如果合适的话)


尝试
| |
方法,但它应该类似于
“{\'company\”:\“'| |?| \'\”}
。当然,使用
setParameter(1,company)
。也不起作用:/他抱怨“-符号。如果我尝试
“{\'company\”:'| |?|}“
错误表示输入字符串意外结束。如果您在每个尝试的选项下的问题中添加实际的错误消息(如果有完整的堆栈跟踪),这将非常有用。顺便说一句,在上面的任何示例中,您似乎都没有使用“”关闭字符串。这是您尝试的实际代码吗?抱歉,复制粘贴错误。我会修好的。不是我正在使用的代码。我将很快发布准确的错误消息。请尝试
“…WHERE jdoc@>cast(“{\”company\”:“| | | to_json(cast(?as text))| |}as json)”
(或
jsonb
在最后一次cast时,如果合适的话)。