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,我建议快照隔离而不是NOLOCKREAD 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&lt;&gt; 而不是 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 运行时出现