gpt4 book ai didi

java - Hibernate/Spring HibernateTemplate.findByCriteria(Deatched Criteria dc) 在 View 上执行sql更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:22 25 4
gpt4 key购买 nike

我正在尝试根据给定条件搜索 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 sessionDEBUG 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com