我正在尝试根据给定条件搜索 View 。此 View 有几个字段用于我的应用程序中用户可能想要搜索的多个不同实体。
当我输入要搜索的实体的名称时,我在调用 .findByCriteria()
之前将名称字段的限制添加到分离条件。这会导致 .findByCriteria()
检索包含我要查找的名称的结果列表。
此外,当我查看我的日志时,我可以看到 hibernate 调用了一个 select
语句。
我现在已经在我的 View 中添加了另一个实体,其中包含一些可搜索的字段。当我尝试搜索与这个新实体相关的字段时,我在日志中遇到异常。
当我查看异常日志时,我可以看到 hibernate 在 select
之后调用 select
语句和 update
语句(我不是要更新记录,只是在列表中检索它)。
那么为什么当我为我的新实体调用 .findByCriteria()
时 hibernate 调用更新?
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
SQL that is executed:
Hibernate:
select
*
from
( select
this_.SEARCH_ID as SEARCH1_35_0_,
this_.ST_NM as ST24_35_0_
from
SEARCH_RESULT this_
where
this_.LOAN_TYPE=? )
where
rownum <= ?
DEBUG 2012-03-21 11:37:19,332 142195 (http-8181-3:org.springframework.orm.hibernate3.HibernateTemplate): [org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:389)] Eagerly flushing Hibernate session DEBUG 2012-03-21 11:37:19,384 142247 (http-8181-3:org.hibernate.SQL): [org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111)]
update
SEARCH_RESULT
set
ADDR_LINE1=?,
ASSGND_REGION=?,
BASE_DEAL_ID=?,
ST_NM=?
where
SEARCH_ID=?
最佳答案
可能会发生更新,因为 Hibernate 被设置为在执行查询之前执行自动刷新,所以如果持久化上下文认为它有脏数据,它将尝试更新它。没有看到代码我不能确定,但我猜即使 search_result 是一个 View ,你相应的 Java 对象在 getters 上被注释并且对象有匹配的 setters。 Hibernate 不区分表和 View ,如果您调用 setter,Hibernate 将假定它有数据更改要更新。
您可以通过添加 @Immutable 注释(或 hibernate.@Entity(mutable = false) 来调整为 View 构建 Java 对象的方式,具体取决于您使用的版本。这应该足以向 Hibernate 表明不要刷新更改。您还可以直接注释字段并摆脱 setter ,以便 SearchResult 对象的使用者知道它是只读的。
关于java - Hibernate/Spring HibernateTemplate.findByCriteria(Deatched Criteria dc) 在 View 上执行sql更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807479/