JPA/Hibernate:IN ?1 的集合参数导致“没有为参数 1 指定值”
Posted
技术标签:
【中文标题】JPA/Hibernate:IN ?1 的集合参数导致“没有为参数 1 指定值”【英文标题】:JPA/Hibernate: Collection parameter for IN ?1 causes "No value specified for parameter 1" 【发布时间】:2013-02-18 06:05:47 【问题描述】:我有一个 JPQL 查询
SELECT wu.tags,
(IF('tag2' IN wu.tags, 1,0) + IF('tag1' IN wu.tags, 1,0) + 0) AS score
FROM WorkUnit wu WHERE wu.tags IN ?1
它像下面的例外一样使用。
发生了什么事?我应该如何通过收集? 对我来说似乎是 Hibernate 错误,因为它在 JDBC 级别搞砸了。
String jpql =
"SELECT wu.tags, (" + sb.toString() + " 0) AS score "
+ " FROM WorkUnit wu WHERE wu.tags IN ?1";
return em.createQuery( jpql )
.setParameter(1, wu.getTags())
//.setMaxResults(maxResults)
.getResultList();
wu.getTags()
返回Set<WorkTag>
。
但这会引发:
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2611)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2586)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2510)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2259)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy72.executeQuery(Unknown Source)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1897)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1698)
at org.hibernate.loader.Loader.doQuery(Loader.java:832)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
at org.hibernate.loader.Loader.doList(Loader.java:2382)
at org.hibernate.loader.Loader.doList(Loader.java:2368)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198)
at org.hibernate.loader.Loader.list(Loader.java:2193)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257)
at org.jboss.essc.web.dao.WorkDao.getWorkUnitsSimilarTo(WorkDao.java:89)
【问题讨论】:
你能像这样将 SET 附加到查询中吗...我不确定:/ 你检查你有 jpa 2 吗? jpa 1 不支持为参数设置集合 嗯,它是 JBoss AS 7.1.3,所以我有 JPA 2.0 而不是 Hibernate 4.1.8。 【参考方案1】:JPQL/HQL 在SELECT
子句中不支持IN
...
实际上,SELECT
中可用的东西非常有限。
http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html#ejb3_langref_select
http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch11.html#ql-expressions
【讨论】:
我在 JPQL 的 select 语句中到处都使用 IN.. 效果很好。以上是关于JPA/Hibernate:IN ?1 的集合参数导致“没有为参数 1 指定值”的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA/Hibernate findby 列名返回空集合
无法使用 Spring Data JPA / Hibernate 在事务中两次保存具有不可变集合的实体