如何使用NHibernate查询Oracle数据库?

如何使用NHibernate查询Oracle数据库?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,帮我把这个翻译成正确的NHibernate 我有一个Oracle数据库,其中包含两个表: Employees: Id (unique id) FirstName (string) LastName (string) Location (string) Locations: Name (string) Address (string) 正如您所看到的,Employees表有一个唯一的id,但是Locations表没有任何id。名称字段是常规字段,

帮我把这个翻译成正确的NHibernate

我有一个Oracle数据库,其中包含两个表:

Employees:
    Id (unique id)
    FirstName (string)
    LastName (string)
    Location (string)

Locations:
    Name (string)
    Address (string)
正如您所看到的,Employees表有一个唯一的id,但是Locations表没有任何id。名称字段是常规字段,并且不是唯一的

在Oracle SQL中,我可以运行以下查询:

SELECT *
FROM Employees e
LEFT OUTER JOIN Locations l
ON e.Location = l.Name
WHERE e.Id = 42
员工42所在的位置在Locations表中有2行,因此此查询返回2行,为员工42找到的每个位置一行

嗯,我不知道如何将其转换为NHibernate映射+查询(我使用Fluent NHibernate)。我倾向于认为我应该将Employees.Location映射为对Locations.Name的引用,因此当运行HQL查询时,它应该返回2个对象,但NHibernate不允许我从引用中检索列表。所以我尝试了HasMany,但它也不起作用,因为NHibernate希望在引用员工的位置上有一个字段,这有点道理

我的HQL查询如下所示:

select e
from Employees e
left join e.Locations l
where e.SGId like :sgId
为什么我可以在常规SQL中而不是在NHibernate中执行此操作


谢谢。

对于映射,如果要为一名员工返回两个位置,则需要使用集合/数组/列表/集合对象和HasMany on your employees映射作为位置

class Employee
{
    public virtual int Id {get;set}
    public virtual string FirstName {get;set;}
    public virtual string LastName {get;set;}
    public virtual IList<Location> Location {get;set;}
}

class EmployeeMapping : ClassMap<Employee>
{
    public EmployeeMapping()
    {
       Id(x=>x.Id);
       Map(x=>x.FirstName);
       Map(x=>x.LastName);
       HasMany<Location>(x => x.Location)
                    .KeyColumn("Name")
                    .PropertyRef("Location") 
                    .LazyLoad();

    }
}
class员工
{
公共虚拟整数Id{get;set}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟IList位置{get;set;}
}
类EmployeeMapping:类映射
{
公共雇员映射()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.LastName);
HasMany(x=>x.Location)
.KeyColumn(“名称”)
.PropertyRef(“位置”)
.LazyLoad();
}
}

对于映射,如果要为一名员工返回两个位置,则需要为该位置使用集合/数组/列表/集合对象和HasMany on your employees映射

class Employee
{
    public virtual int Id {get;set}
    public virtual string FirstName {get;set;}
    public virtual string LastName {get;set;}
    public virtual IList<Location> Location {get;set;}
}

class EmployeeMapping : ClassMap<Employee>
{
    public EmployeeMapping()
    {
       Id(x=>x.Id);
       Map(x=>x.FirstName);
       Map(x=>x.LastName);
       HasMany<Location>(x => x.Location)
                    .KeyColumn("Name")
                    .PropertyRef("Location") 
                    .LazyLoad();

    }
}
class员工
{
公共虚拟整数Id{get;set}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟IList位置{get;set;}
}
类EmployeeMapping:类映射
{
公共雇员映射()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.LastName);
HasMany(x=>x.Location)
.KeyColumn(“名称”)
.PropertyRef(“位置”)
.LazyLoad();
}
}

我找到了解决方案,您必须将HasMany(x=>x.Locations)与.PropertyRef(“Location”)结合使用,以便hibernate知道员工中用于加入的字段应该是Location(而不是默认的员工id)

class员工
{
公共虚拟整数Id{get;set}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串位置{get;set;}
公共虚拟IList位置{get;set;}
}
类EmployeeMapping:类映射
{
公共雇员映射()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.LastName);
地图(x=>x.Location);
拥有多个(x=>x个位置)
.PropertyRef(“位置”)
.KeyColumn(“名称”);
}
}

此外,我发现我的方法中存在一些缺陷,主要是因为我使用的是奇怪的遗留数据库。这不会改变解决方案,但我想补充一点,如果您正在处理的某个表没有唯一的ID,那么您就有麻烦了。Hibernate需要一个唯一的id,所以在我的例子中,为了使它唯一,我必须使用一个由多个字段组成的复合id。这是另一个争论,但我想在这里提到它,以帮助将来研究此主题的人。

我找到了解决方案,您必须将HasMany(x=>x.Locations)与.PropertyRef(“Location”)结合使用,以便hibernate知道用于加入的Employee中的字段应该是Location(而不是默认的员工id)

class员工
{
公共虚拟整数Id{get;set}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串位置{get;set;}
公共虚拟IList位置{get;set;}
}
类EmployeeMapping:类映射
{
公共雇员映射()
{
Id(x=>x.Id);
Map(x=>x.FirstName);
Map(x=>x.LastName);
地图(x=>x.Location);
拥有多个(x=>x个位置)
.PropertyRef(“位置”)
.KeyColumn(“名称”);
}
}

此外,我发现我的方法中存在一些缺陷,主要是因为我使用的是奇怪的遗留数据库。这并没有改变解决方案,但我想补充一点,如果您处理的某个表没有唯一的id,那么您就有麻烦了。Hibernate需要唯一的id,所以在我的例子中,我必须提出一个由多个字段组成的复合idn为了使其独特。这是另一场辩论,但我想在这里提及它,以帮助将来研究此主题的人。

这不会起作用,因为您缺少了。PropertyRef(),结果是。我用该新元素添加了一个新的解决方案。感谢您的帮助。这不会起作用,因为您缺少了。PropertyRef(),原来是这样。我用这个新元素添加了一个新的解决方案。谢谢你的帮助。