【问题标题】:NHibernate - easiest way to do a LIKE search against an integer column with Criteria API?NHibernate - 使用 Criteria API 对整数列进行 LIKE 搜索的最简单方法?
【发布时间】:2009-08-05 03:37:38
【问题描述】:

我正在尝试对整数列进行类似搜索,我需要做的实际上是将列转换为 varchar,然后进行类似搜索。这可能吗?使用 Criteria API 最简单的方法是什么?

var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))

【问题讨论】:

    标签: nhibernate nhibernate-criteria


    【解决方案1】:

    如果 Number 是一个字符串,那就很简单了:

    .Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))
    

    因为你有一个数字,NHibernate 会检查数字的类型,如果你给它一个字符串,它会抛出一个异常。

    不知道为什么 NH 团队没有提供带有对象作为参数和 MatchMode 参数的重载 ....

    无论如何,你仍然可以这样做:

    .Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))
    

    编辑

    关于别名:

    (我找不到文档在哪里谈论这个,但这是我对它的理解)

    {alias} 返回 NH 在内部为最近的 CreateCriteria 使用的别名。所以如果你有:

    session.CreateCriteria<User>("firstAlias")
           .CreateCriteria("firstAlias.Document", "doc")
           .Add(Expression.Sql("{alias}.Number like ?", "%2%",  
                               NHibernateUtil.String)).List<User>();
    

    {alias} 在这种情况下是 'doc' - 所以你最终会得到 : doc.Number 。

    因此,请始终在您需要使用其别名的 CreateCriteria 之后使用 {alias}。

    【讨论】:

    • 太好了,谢谢。对于 sql 表达式上的别名...我使用“this_.Number”没问题,我保证 NHibernate 将始终使用 this_.?
    • 因为我确实使用“wi”为我的条件命名 - session.CreateCriteria("wi") - 但我不能在 sql 表达式中使用“wi.Number”,因为它把它从字面上理解到 T-SQL 中(如果有意义的话)。
    • 并在常规条件创建调用中感知“wi”实际上在发送到服务器的 T-SQL 中转换为“this_”,我继续将 sql 表达式中的别名设置为“this_”。号码”
    • @sirrocco - 大声笑,当您在 sql 表达式中输入“{alias}”时,我虽然您的意思是“将您为标准创建的别名放在这里”.. 我不认为您打算实际上按字面意思输入“{alias}”。但这是完美的,如果可以的话,我会给你 +10,这对你有很大帮助。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2011-03-14
    • 2012-11-18
    • 2019-05-22
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多