【发布时间】:2014-11-20 11:27:00
【问题描述】:
我们有 2 个表/类,我们称它们为 NewOne 和 OldOne。 OldOne 的 Id 类型为 int,NewOne 具有 OldOne 的属性 OldValues 磁带和映射的字符串 SourceType(数据库为 Oracle):
<many-to-one name="OldValues" column="SOURCE_ID" />
<property name="SourceType " column="Source_Type " type="AnsiString" />
我们想在 SourceType='Old' 时从 NewOne 和 OldOne 获取数据,但问题是 OldOne 表的 ID 列是数字,Source_Id 列是 varchar 存储其他类型的 id,如名称等。我们无法更改类型ID 既不是 Source_ID 列。使用 to_char() 函数可以在 sql 中轻松完成这种连接:
left outer join OldOne old_
on this_.SOURCE_ID = to_char(old_.ID)
and (this_.Source_Type = 'Old')
但我在 QueryOver 中找不到等效的 to_char。下面是有条件连接但没有 to_char() 的版本:
OldOne OldOneAlias = null;
NewOne NewOneAlias = null;
return this.ActiveSession.QueryOver<NewOne>(() => NewOneAlias)
.JoinAlias(r => r.OldValues,
() => OldOneAlias,
JoinType.LeftOuterJoin,
Restrictions.Eq(
Projections.Property(() => NewOneAlias.SourceType), "Old"))
有什么方法可以使用 QueryOver 创建带有 to_char 的查询?
更新:
我在这里找到了一个有点丑陋的解决方案:"Safe" TO_NUMBER() 并且在更改我的映射后一切正常:
<many-to-one name="OldValues" formula="COALESCE(TO_NUMBER(REGEXP_SUBSTR(SOURCE_ID, '^\d+')), 0)" />
主要问题是之前的查询忽略了“and (this_.Source_Type = 'Old')”,即使 Source_Type != Old 和 SOURCE_ID 不是数字,也会尝试与 OldOne 连接。不确定它是否只是 Oracle 的问题。
【问题讨论】:
-
我认为这并不容易——QueryOver 加入映射的关联,因此您可以尝试将
many-to-one映射更改为使用to_char()加入。 Oracle 是否支持计算列?如果是这样,您可以使用to_char创建一个计算列并映射 that 列
标签: .net oracle nhibernate queryover