Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate/Spring HibernateTemplate.findByCriteria(Deached Criteria dc)在视图上执行sql更新_Java_Hibernate - Fatal编程技术网

Java Hibernate/Spring HibernateTemplate.findByCriteria(Deached Criteria dc)在视图上执行sql更新

Java Hibernate/Spring HibernateTemplate.findByCriteria(Deached Criteria dc)在视图上执行sql更新,java,hibernate,Java,Hibernate,我正在尝试根据给定的条件搜索视图。此视图有几个字段,用于用户可能希望搜索的我的应用程序中的多个不同实体 输入要搜索的实体的名称时,在调用.findByCriteria()之前,我会将名称字段的限制添加到分离的条件中。这会导致.findByCriteria()检索一个带有我要查找的名称的结果列表 另外,当我查看日志时,我可以看到hibernate调用selectstation 现在,我在视图中添加了另一个实体,其中包含一些可搜索的字段。当我尝试搜索与这个新实体相关的字段时,我的日志中会出现异常 当

我正在尝试根据给定的条件搜索视图。此视图有几个字段,用于用户可能希望搜索的我的应用程序中的多个不同实体

输入要搜索的实体的名称时,在调用
.findByCriteria()
之前,我会将名称字段的限制添加到分离的条件中。这会导致
.findByCriteria()
检索一个带有我要查找的名称的结果列表

另外,当我查看日志时,我可以看到hibernate调用
select
station

现在,我在视图中添加了另一个实体,其中包含一些可搜索的字段。当我尝试搜索与这个新实体相关的字段时,我的日志中会出现异常

当我查看我的日志时,除了异常,我可以看到hibernate在
select
之后调用
select
station,并使用
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)
可能发生了更新,因为Hibernate被设置为在执行查询之前执行自动刷新,所以如果持久性上下文认为它有脏数据,它将尝试更新它。在没有看到代码的情况下,我无法确定,但我猜即使搜索结果是一个视图,您对应的Java对象也会在getter上注释,并且该对象具有匹配的setter。Hibernate不区分表和视图,如果调用setter,Hibernate将假定它有数据更改要更新


通过添加@Immutable注释(或hibernate@Entity(mutable=false),可以调整如何为视图构建Java对象取决于您使用的版本。这应该足以指示休眠以不刷新更改。您还可以直接对字段进行注释,并去掉设置器,以便SearchResult对象的使用者知道它是只读的。

您可以粘贴SearchResult模型对象的代码吗?我添加了不可变的注释to我的域类,修复了我遇到的问题。感谢Jeff的帮助。
    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=?