NHibernate 和 Oracle 的按位与

发布于 2024-10-17 17:07:19 字数 825 浏览 3 评论 0原文

我将 Fluent NHibernate 1.0RC(适用于 NHibernate 2.1.4000)与 Linq 2 NHibernate 一起使用,并且我想使用按位与运算来执行查询。我首先尝试像这样使用 Linq,但这不起作用:

var objects = _session.Linq<MyClass>()
                      .Where(x => (x.someInteger & otherInteger) > 0)
                      .ToList(); 

我的结论是 Linq 2 Nhibermate 不支持按位运算。所以我尝试使用 HQL:

var objects =  _session.CreateQuery("select c from MyClass c 
                                     where c.someInteger & :param > 0")
                                .SetParameter("param", otherInteger)
                                .List<MyClass>();

这也不起作用。它给了我一个 ora-01036 错误:“非法变量名/数字”。

所以我的问题是:是否可以在 NHibernate 中使用按位运算? NHibernate 3.0 是否支持开箱即用?这是有问题的吗,因为我使用的是 Oracle DB,它需要 bitand() 函数而不是 & 函数。操作员?

I am using Fluent NHibernate 1.0RC (for NHibernate 2.1.4000) together with Linq 2 NHibernate, and I want to execute a query with a bitwise and operation. I first tried using Linq like this, but that did not work:

var objects = _session.Linq<MyClass>()
                      .Where(x => (x.someInteger & otherInteger) > 0)
                      .ToList(); 

My conclusion here was that bitwise operations was not supported by Linq 2 Nhibermate. So I tried using HQL instead:

var objects =  _session.CreateQuery("select c from MyClass c 
                                     where c.someInteger & :param > 0")
                                .SetParameter("param", otherInteger)
                                .List<MyClass>();

This did not work either. It gave me an ora-01036 error: "illegal variable name/number".

So my questions are: Is it even possible to use bitwise operations with NHibernate? Is it supported out of the box with NHibernate 3.0? Is this problematic because I am using an Oracle DB, which will expect bitand() function instead of an & operator?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

紫罗兰の梦幻 2024-10-24 17:07:19

您可以扩展 Oracle 方言并将 BITAND 添加为可识别的 HQL 函数:

public class OraclePlusDialect : Oracle10gDialect
{
    public OraclePlusDialect()
    {
        RegisterFunction("bitand", new StandardSQLFunction("bitand", NHibernateUtil.Int32));
    }    
}

然后您应该能够像这样执行查询:

var objects =  _session.CreateQuery("select c from MyClass c 
                     where bitand(c.someInteger, :param) > 0")
                 .SetParameter("param", otherInteger)
                 .List<MyClass>();

可能,Oracle 有类型转换问题,因为 BITAND > 返回很少使用的数据类型。如果是这种情况,请将 HQL 查询修改为:

select c from MyClass c 
    where bitand(c.someInteger, :param) + 0 > 0

You could extend the Oracle dialect and add BITAND as a recoginzed HQL function:

public class OraclePlusDialect : Oracle10gDialect
{
    public OraclePlusDialect()
    {
        RegisterFunction("bitand", new StandardSQLFunction("bitand", NHibernateUtil.Int32));
    }    
}

Then you should be able to execute your query like this:

var objects =  _session.CreateQuery("select c from MyClass c 
                     where bitand(c.someInteger, :param) > 0")
                 .SetParameter("param", otherInteger)
                 .List<MyClass>();

Possibly, Oracle has a type conversion problem becuase BITAND returns a rarely used data type. If this is the case, modify your HQL query to:

select c from MyClass c 
    where bitand(c.someInteger, :param) + 0 > 0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文