【问题标题】:NHibernate Criteria using Projections for Substring with in clauseNHibernate Criteria using Projections for Substring with in 子句
【发布时间】:2010-12-16 08:11:32
【问题描述】:

我在 Oracle 中有一个场景,我需要将列的子字符串部分与值列表匹配。我正在使用 sqlfunction 投影在所需列上应用子字符串,并将该投影添加为 In 子句限制的一部分。以下是我为此编写的简化标准。

ICriteria criteriaQuery = session.CreateCriteria<Meeting>()
    .Add(Restrictions.In(
        Projections.SqlFunction(
            "substring",
            NHibernateUtil.String,
            Projections.Property("Code"),
            Projections.Constant(1),
            Projections.Constant(3)),
        new string[] { "D01", "D02" }))
        .Add(Restrictions.In("TypeId", meetingTypes));

我遇到的问题是生成的 SQL 是错误的,其中为语句注册的参数数量超过了语句实际使用的数量,并且某些参数即使没有使用也会重复。这会导致语句失败并显示消息 - ORA-01036:非法变量名称/编号。 生成的查询

SELECT this_.Meeting_id as Meeting1_0_2_, .....  
WHERE substr(this_.Mcs_Main, :p0, :p1) in (:p2, :p3) 
and this_.Meeting_Type_Id in (:p4, :p5);
:p0 = 1, :p1 = 3, :p2 = 1, :p3 = 3, :p4 = 'D02', :p5 = 'D03', :p6 = 101, :p7 = 102

p2 和 p3 再次生成,是 p0、p1 的副本,因此整个查询都失败了。

我可以通过将新属性映射到公式来临时解决此问题,但我认为这不是正确的方法,因为即使我不需要评估子字符串,公式也会始终执行。

关于与 In 子句组合使用时投影是否正常工作的任何建议,当我使用 Equal Restriction 而不是 In 时,相同的投影工作正常。

【问题讨论】:

  • 您使用的是哪个版本的 NHibernate?
  • 我在 NH 和 oracle 中遇到过类似的情况,但它在 2.1 中已修复。我确实通过访问他们的 Jira 站点发现了一个错误:nhjira.koah.net/secure/Dashboard.jspa 您也可以在 IRC 上的 ##nhibernate at freenode 上询问他们。
  • LEFT() 似乎也会出现同样的问题。

标签: nhibernate criteria projection criteria-api


【解决方案1】:

此错误已在 3.0.0.GA 版本中修复。

【讨论】:

  • 您知道问题跟踪器 ID 吗?我在 3.2.0GA 中仍然看到这个问题。
  • @Nathan Baulch - 抱歉,没有。我刚刚针对 3.0.0.GA 测试了我的声明,它奏效了。
  • 好的,一定是3.2的回归。我创建了一个单元测试并将其提交给问题跟踪器:nhibernate.jira.com/browse/NH-3008
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 2021-05-15
  • 2014-11-27
  • 2014-11-09
  • 1970-01-01
  • 2017-07-20
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多