hibernate查询中使用nolock时出现识别错误
Posted
技术标签:
【中文标题】hibernate查询中使用nolock时出现识别错误【英文标题】:A recognition error occurred when nolock is used in hibernate query 【发布时间】:2019-08-01 16:11:01 【问题描述】:我有一个简单的休眠查询,查询中使用了 nolock。我收到错误 - 发生识别错误并且休眠错误是抛出异常:NHibernate.dll 中的“NHibernate.Hql.Ast.ANTLR.QuerySyntaxException”。它可以在没有锁定的情况下工作。我不想使用
<property name="connection.isolation">ReadUncommitted</property>
因为我必须只对特定表应用 nolock。
下面是hql查询-
select d from Users d with (nolock) where d.Userid = 2
我错过了什么吗?
【问题讨论】:
为什么一定要申请NOLOCK
?
无论数据是否被另一个进程锁定,我都想快速读取数据。实际上我正在评估我的项目的一些 hql 查询。
@SSD,我建议快照隔离而不是NOLOCK
或READ UNCOMITTED
。请注意,NOLOCK
可能会导致结果中的行被跳过或重复,而不仅仅是未提交的数据。
这不是 NOLOCK
通过 @SSD 所做的。 Bad Habits: Putting NOLOCK everywhere.
【参考方案1】:
HQL 将不支持直接with (nolock)
。但是我们可以使用原生 SQL 查询。
因此,例如,而不是像这样(获取用户列表):
var hql = "select d from Users d with (nolock) where d.Userid = 2";
var query = session.CreateQuery(sql);
var result = query.List<User>();
我们需要使用原始的 sql API
var sql = "select d.* from schema.UserTable d with (nolock) where d.user_id = 2 ";
var query = session.CreateSQLQuery(sql);
var result = query
.AddEntity(typeof(User))
.List<User>();
如果我们知道通过 ID 只会返回一个用户.. 我们可以使用 UniqueResult<>
而不是 List
【讨论】:
谢谢@Radim。如果我已经用代码编写了复杂的 HQL 查询怎么办。我是否必须更改代码来为每个编写本机 sql 然后执行。 HQL 的重点是......它只是我们的实体之上的一种查询语言。我们正在查询域(POCO 对象),不构建 SQL.. 无法直接访问底层数据库引擎功能。我们可以用一些 .. 超级特殊的魔法为任何查询添加一些提示......例如。引入拦截器并覆盖SqlString OnPrepareStatement
...但在您的情况下...我更喜欢原始SQL而不是HQL...因为它更简单。而且,我们在这里做的是非常原始的 SQL ......我们确实使用数据库引擎提示......即原始 sql......以上是关于hibernate查询中使用nolock时出现识别错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 nolock 的 Java Hibernate HQL 查询
Hibernate - 使用 net.ucanaccess.jdbc.UcanaccessDriver 时出现 org.hibernate.MappingException
使用 Criteria 运行子查询时出现 ClassCastException (String to Long)
在 Spring JSP 页面中使用集合时出现 Hibernate LazyInitializationException
Java Hibernate LazyInitializationException 仅在仅使用 JUnit 运行时出现