2017-01-11 31 views
-1
@NamedQuery(name="getHeightByTaskId",query="select otherheight from BTSTaskDetail where id=2 for update") 

错误错误在Hibernate命名查询

错误internal.SessionFactoryImpl - HHH000177:错误命名查询: getHeightByTaskId org.hibernate.hql.internal.ast.QuerySyntaxException: 意外的标记:近线1,列79从 com.inn.siteforge2.bts.model.BTSTaskDetail选择otherheight其中id = 2的更新]

回答

0

for update无效Ĵ PQL关键字

对于锁定的标准方法使用一个:https://en.wikibooks.org/wiki/Java_Persistence/Locking

+0

什么是替代选择更新休眠 –

+0

选择整个实体,进行更改,并调用合并() –

+0

@AnkitPatwa标记答案为有用 –

0
@NamedQuery(name = "BTSTaskDetail.otherheight", query = "SELECT c FROM BTSTaskDetail c WHERE c.otherheight = :otherheight"), 

现在更新实体并保存。

+0

我知道这将工作。但实际问题是多个线程同时是增量高度值。例如一次高度值为4,5个线程同时从db读取数值并将其增加1并在db中更新最终结果为5应该是这个问题通过选择在MySQL中正常工作的更新查询来解决。当我们使用select进行更新时,它会在读取数据时锁定特定的行,并在提交数据时将其解锁。 –

+0

@AnkitPatwa您使用的是哪种锁定? –

+0

我正在使用hibernate框架和spring事务管理.Hibernate内部管理锁定。 –