org.hibernate.QueryException, in expected..

本文分析了一个 Hibernate QueryException 的具体错误实例,指出问题出现在 FROM 子句中的实体类定义上,并给出了两种可能的原因:实体类名称大小写错误及实体类映射文件未正确配置。
org.hibernate.QueryException: in expected: device [select device,
       s.name ,
       mr.name ,
       p.productTypeId, 
       p.name
 from DeviceBaseInfo_Simple device,
       com.test.DAO.ecmis.Station        s,
       com.test.DAO.ecmis.MachineRoom    mr,
       com.test.DAO.ecmis.Product        p
  where device.id in (2641,2642)
  and device.stationId=s.id(+)
  and device.productId=p.id(+)
  and device.machineRoomId=mr.id(+)
]
	at org.hibernate.hql.classic.FromParser.token(FromParser.java:106)
	at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
	at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
	at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216)
	at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1624)
	at com.test.DAO.ABaseHibernateQueryDAO.findListBySql(ABaseHibernateQueryDAO.java:617)
	at com.test.ecmis.sheet.serviceImpl.SheetServiceImpl.updateCircuitModifyRecord(SheetServiceImpl.java:325)
	at com.test.ecmis.circuit.serviceImpl.CircuitServiceImpl.saveCircuit(CircuitServiceImpl.java:1405)
	at com.test.ecmis.circuit.action.CircuitAction.saveCircuit(CircuitAction.java:329)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.test.common.interceptors.CommonInterceptor.intercept(CommonInterceptor.java:56)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.test.common.interceptors.ActionInvocationRecordInterceptor.intercept(ActionInvocationRecordInterceptor.java:30)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.test.common.interceptors.ExceptionInterceptor.intercept(ExceptionInterceptor.java:24)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at com.test.base.BaseFilter.doFilter(BaseFilter.java:190)
	at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
	at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
	at weblogic.security.service.SecurityManager.runAs(Unknown Source)
	at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
	at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
	at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

 

可能有两种:

1、 FROM 后面的Hibernate实体类类名大小写写错。

2、 FROM 后面某个Hibernate实体类的 hbm 映射文件, 路径没有放到Hibernate.cfg.xml中。

`org.hibernate.event.def.AbstractFlushingEventListener.onFlush` 是 Hibernate 框架中与事件监听相关的一个重要方法。 ### 作用 在 Hibernate 中,事件监听机制允许开发者在特定的操作发生时执行自定义逻辑。`AbstractFlushingEventListener.onFlush` 方法主要用于处理 Hibernate 的刷新操作。刷新操作是指将 Hibernate 会话(Session)中的持久化对象的状态同步到数据库中。当调用 `Session.flush()` 方法或者在事务提交时,Hibernate 会触发刷新操作,而 `onFlush` 方法就是在这个过程中被调用,负责协调和执行将内存中的对象变更写入数据库的一系列操作,例如插入、更新和删除数据库记录等。 ### 使用方法 通常情况下,开发者不会直接调用 `onFlush` 方法,因为它是 Hibernate 内部事件处理机制的一部分。不过,可以通过自定义事件监听器来扩展 `AbstractFlushingEventListener` 类,并重写 `onFlush` 方法以实现特定的业务逻辑。以下是一个简单的示例: ```java import org.hibernate.event.def.AbstractFlushingEventListener; import org.hibernate.event.EventSource; import org.hibernate.event.FlushEvent; public class CustomFlushingEventListener extends AbstractFlushingEventListener { @Override protected void onFlush(FlushEvent event) throws org.hibernate.HibernateException { EventSource session = event.getSession(); // 在这里可以添加自定义的逻辑,例如记录日志、验证数据等 System.out.println("Before flushing to the database..."); super.onFlush(event); System.out.println("After flushing to the database..."); } } ``` 然后在 Hibernate 配置文件中注册这个自定义的事件监听器: ```java import org.hibernate.cfg.Configuration; import org.hibernate.SessionFactory; import org.hibernate.event.EventListeners; import org.hibernate.event.FlushEvent; import org.hibernate.event.FlushEventListener; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); // 获取事件监听器管理器 EventListeners eventListeners = sessionFactory.getEventListeners(); // 获取当前的刷新事件监听器数组 FlushEventListener[] currentFlushListeners = eventListeners.getFlushEventListeners(); // 创建自定义的刷新事件监听器 FlushEventListener customFlushListener = new CustomFlushingEventListener(); // 将自定义监听器添加到监听器数组中 FlushEventListener[] newFlushListeners = new FlushEventListener[currentFlushListeners.length + 1]; System.arraycopy(currentFlushListeners, 0, newFlushListeners, 0, currentFlushListeners.length); newFlushListeners[currentFlushListeners.length] = customFlushListener; // 设置新的刷新事件监听器数组 eventListeners.setFlushEventListeners(newFlushListeners); HibernateUtil.sessionFactory = sessionFactory; } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } ``` ### 常见问题及解决方案 #### 1. `org.hibernate.StaleStateException` 当出现 `org.hibernate.StaleStateException` 错误,如 `Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1` 时,通常表示在刷新操作时,Hibernate 尝试更新数据库中的记录,但发现记录不存在或者版本不匹配。这可能是因为在 Hibernate 会话中修改了一个已经在数据库中被删除或者版本不一致的对象。 解决方案:检查对象的状态,确保在操作对象之前对象仍然存在于数据库中。可以在更新操作前先查询对象,或者使用乐观锁机制来处理并发问题。 #### 2. 数据库同步失败 像 `[main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database` 这样的错误,可能是由于 SQL 语句执行失败、数据库连接问题或者数据完整性约束违反等原因导致。 解决方案:检查 SQL 语句是否正确,确保数据库连接正常,并且数据符合数据库的完整性约束。可以查看 Hibernate 生成的 SQL 语句,使用数据库日志来排查问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值