【问题标题】:NHibernate.Hql.Ast.ANTLR.QuerySyntaxException in Orchard CMSOrchard CMS 中的 NHibernate.Hql.Ast.ANTLR.QuerySyntaxException
【发布时间】:2015-01-24 10:53:40
【问题描述】:

使用 Orchard.Projections 模块,无法搜索 Unicode 文本。例如,结果查询是Select ... From ... Where ... Col Like '%term%',但我们期望Select ... From ... Where ... Col Like N'%term%'(N 包含在Like 之后)。在代码中查找它,我们在 Orchard.ContentManagement.HqlRestrictions 中找到 public static BinaryExpression Like()。通过添加 N 并将 value = "'%" + FormatValue(value, false) + "%'"; 更改为 value = "N'%" + FormatValue(value, false) + "%'";,我们会收到此错误:

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException was caught
  HResult=-2146232832
  Message=Exception of type 'Antlr.Runtime.MismatchedTokenException' was thrown. near line 9, column 61
  Source=NHibernate
  StackTrace:
       at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException() in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\ErrorCounter.cs:line 73
       at NHibernate.Hql.Ast.ANTLR.HqlParseEngine.Parse() in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 479
       at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryString, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line 19
       at NHibernate.Engine.Query.HQLStringQueryPlan.CreateTranslators(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Engine\Query\HQLStringQueryPlan.cs:line 24
       at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Engine\Query\HQLStringQueryPlan.cs:line 16
       at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Engine\Query\HQLStringQueryPlan.cs:line 14
       at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String queryString, Boolean shallow, IDictionary`2 enabledFilters) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Engine\Query\QueryPlanCache.cs:line 62
       at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String query, Boolean shallow) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:line 310
       at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String queryString) in c:\Users\sebros\Documents\My Projects\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:line 289
       at Orchard.ContentManagement.DefaultHqlQuery.Slice(Int32 skip, Int32 count) in d:\Projects\...\src\Orchard\ContentManagement\DefaultHqlQuery.cs:line 188
       at Orchard.Projections.Services.ProjectionManager.GetContentItems(Int32 queryId, Int32 skip, Int32 count)
       at Orchard.Projections.Drivers.ProjectionPartDriver.<>c__DisplayClass2e.<Display>b__1e(Object shape)
       at Orchard.ContentManagement.Drivers.ContentPartDriver`1.<>c__DisplayClass12.<ContentShape>b__11(BuildShapeContext ctx) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\ContentPartDriver.cs:line 135
       at Orchard.ContentManagement.Drivers.ContentPartDriver`1.<>c__DisplayClass15.<ContentShapeImplementation>b__14(BuildShapeContext ctx) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\ContentPartDriver.cs:line 140
       at Orchard.ContentManagement.Drivers.ContentShapeResult.ApplyImplementation(BuildShapeContext context, String displayType) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\ContentShapeResult.cs:line 45
       at Orchard.ContentManagement.Drivers.ContentShapeResult.Apply(BuildDisplayContext context) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\ContentShapeResult.cs:line 21
       at Orchard.ContentManagement.Drivers.CombinedResult.Apply(BuildDisplayContext context) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\CombinedResult.cs:line 28
       at Orchard.ContentManagement.Drivers.Coordinators.ContentPartDriverCoordinator.<>c__DisplayClassa.<BuildDisplay>b__9(IContentPartDriver driver) in d:\Projects\...\src\Orchard\ContentManagement\Drivers\Coordinators\ContentPartDriverCoordinator.cs:line 49
       at Orchard.InvokeExtensions.Invoke[TEvents](IEnumerable`1 events, Action`1 dispatch, ILogger logger) in d:\Projects\...\src\Orchard\InvokeExtensions.cs:line 17
  InnerException: 

第 9 行,第 61 列表示“N”的位置。

有什么想法吗? 我们如何使用这个模块在不更改数据库排序规则的情况下搜索 unicode 文本?

果园版本是1.8.1

【问题讨论】:

  • 只是...脱离原生 NHibernate 的 包装器... NHibernate 中的原生 HQL 确实支持参数 var hql="FROM Entity e WHERE e.Property Like :value"; 和通过使用 unicode 方法设置值:.SetString("value", unicodeValue); - 生成的 SQL 完全按预期工作...
  • @BertrandLeRoy,我已经发布了一个讨论,orchard.codeplex.com/discussions/578488。是否可以将线程移动到问题中?顺便问一下,有什么快速的解决方案吗?我们可能无法等待下一个版本。谢谢
  • 或许能解决你的问题stackoverflow.com/questions/447566/…
  • CTRL+A, CTRL+C, CTRL+V ;) 如果您无法自行修复或等待修复,我可以看到的解决方法是从投影切换到直接 HQL 查询。我有一系列帖子可以帮助您入门:weblogs.asp.net/bleroy/Tags/NHibernate

标签: nhibernate unicode orchardcms


【解决方案1】:

快速修复。我已经直接更改了数据库的排序规则设置

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多