hibernate命名查询中出错
错误 错误internal.SessionFactoryImpl-HH000177:命名查询中出现错误: getHeightByTaskId org.hibernate.hql.internal.ast.QuerySyntaxException: 意外标记:对于第1行附近的第79列[从中选择otherheight] com.inn.sitefeg2.bts.model.BTSTaskDetail其中id=2用于更新]hibernate命名查询中出错,hibernate,Hibernate,错误 错误internal.SessionFactoryImpl-HH000177:命名查询中出现错误: getHeightByTaskId org.hibernate.hql.internal.ast.QuerySyntaxException: 意外标记:对于第1行附近的第79列[从中选择otherheight] com.inn.sitefeg2.bts.model.BTSTaskDetail其中id=2用于更新] 更新的不是有效的JPQL关键字 要锁定,请使用标准方法之一: 现在更新您的实体
更新的
不是有效的JPQL关键字
要锁定,请使用标准方法之一:
现在更新您的实体并保存它们。如何
@NamedQuery(name = "BTSTaskDetail.otherheight", query = "SELECT c FROM BTSTaskDetail c WHERE c.otherheight = :otherheight"),
?在Hibernate中选择更新的替代方法是什么选择整个实体,进行更改,然后调用merge(),我知道这会起作用。但实际问题是多个线程同时增加高度值。例如,一次高度值为4,5个线程同时从数据库中读取值,并将其增加1,然后在数据库中更新最终结果为5,应该是9。这个问题通过在mysql中运行良好的select For update查询解决。当我们使用select for update时,它会在读取数据时锁定特定行,并在读取数据时解锁该行committed@AnkitPatwa您使用的是什么类型的锁定?我使用的是hibernate框架和spring事务管理。hibernate在内部管理锁定。您需要将bean或facade声明为@Singleton scope of session。
@NamedQuery(name = "BTSTaskDetail.otherheight", query = "SELECT c FROM BTSTaskDetail c WHERE c.otherheight = :otherheight"),
@NamedQuery(name="getHeightByTaskId",query="select otherheight from BTSTaskDetail where id=2",lockMode = PESSIMISTIC_WRITE)