NHibernate Criteria使用PROject for Substring with in子句

时间:2009-11-13 15:29:04

标签: nhibernate criteria projection criteria-api

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

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时,相同的投影工作正常。

1 个答案:

答案 0 :(得分:0)

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