我们使用Hibernate作为ORM将我们的实体映射到数据库。
我们所有的数据库查询/交易都是通过entity进行的。数据库查询(选择/插入/更新/删除)是由休眠生成的。
在一种情况下,我们添加了条件限制(IN),以包括以下值列表。
c.add(Restrictions.in(column_name,list));
对于某些业务案例/场景,列表可以为空。以上条件将导致休眠状态创建查询为
select * from table where column_name in ();
这将导致以下错误,在Oracle中
Caused by: org.hibernate.exception.SQLGrammarException: ORA-00936: missing expression
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
at com.sun.proxy.$Proxy1751.executeQuery(Unknown Source) ~[na:na]
在我们的开发环境中,我们使用H2,它支持空的IN子句。我们在质量检查环境中使用oracle数据库,并看到上述质量检查失败。
尽管这显然是一个oracle错误消息,但我试图了解在生成SQL时是否可以设置任何休眠属性/属性来通过休眠处理/管理这种情况。
Stack:hibernate-core-4.1.2,hibernate-entitymanager-4.1.2,hibernate-jpa-2.0-api-1.0.1.Final.jar