2013-01-07 21 views
0

我们将Hibernate与Sybase Anywhere 12一起使用,并在使用SQLQuery的视图上查询时遇到问题。重新启动数据库和只有一次后Hibernate SQLQuery(主机变量的值不足)

SQLQuery query = session.createSQLQuery(" SELECT * FROM myview WHERE x = :x AND y IN (:y) "); 
query.setParameter("x", "z1234"); 
query.setParameterList("y", Arrays.asList(1, 2, 3, 4)); 
query.setReadOnly(true); 
query.addEntity(ClassX.class); 
List result = query.list(); 

查询失败。如果我们使用相同的参数第二次执行相同的查询,它将顺利运行。

该视图基于表和另一个基于两个表的视图。这些表确实有触发器。以防万一这可能是我们的问题的来源,但它并没有让我觉得,因为我确实调试到Connection#prepareStatement(...)SQLException发生。

Caused by: java.sql.SQLException: [Sybase][JDBC Driver][SQL Anywhere]Not enough values for host variables 
     at sybase.jdbc4.sqlanywhere.IConnection.nativePrepareStatement(Native Method) ~[sajdbc4.jar:na] 
     at sybase.jdbc4.sqlanywhere.IConnection.prepareStatement(IConnection.java:599) ~[sajdbc4.jar:na] 
     at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) ~[na:na] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_09] 
     at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.7.0_09] 
     at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:125) ~[com.springsource.org.apache.tomcat.jdbc-1.1.0.1.jar:na] 
     at $Proxy104.prepareStatement(Unknown Source) ~[na:na] 
     at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) ~[hibernate-core-3.6.9.Final.jar:3.6.9.Final] 

任何想法?


10:16:33.851 WARN [http-9443-2] org.hibernate.util.JDBCExceptionReporter.logExceptions[233] - SQL Error: -188, SQLState: 07002 
10:16:33.851 ERROR [http-9443-2] org.hibernate.util.JDBCExceptionReporter.logExceptions[234] - [Sybase][JDBC Driver][SQL Anywhere]Nicht genügend Werte für Hostvariablen 

参考文献:Sybase Docs

+0

Sybase文档说=“您没有为绑定变量的数量或命令或选择列表项的数量提供足够的主机变量。”请检查您的输入并绑定 –

+0

谢谢。我没有读过Sybase文档。 :-)如果'PreparedStatement#executeQuery()'会抛出'SQLException'而不是'Connection#prepareStatement(sqlQuery)',而'sqlQuery'等于'SELECT * FROM myview WHERE x =? AND y IN(?,?,?,?)'。那时没有参数通过,或者我错过了什么? –

回答

0

我想我已经找到了我的问题的根源。 myview在Sybase Central中确实有警告符号。 myview基于另一个被删除并重新创建的视图。因此,myview需要重新编译。

但是,抛出的SQLException的SQL代码是错误的,并导致错误的方向找到问题的根源。 Connection#prepareStatement(sqlQuery)不传递任何参数。