将属性映射到索引列

时间:2010-08-27 22:30:00

标签: nhibernate fluent-nhibernate

我正在尝试使用索引列映射List。这工作正常,但我也希望能够从HQL查询索引列。当我这样做时HQL抛出异常:

  

NHibernate.QueryException:无法解析属性:位置:组件[位置,时间]

为了能够从HQL查询WayPoint.Position列,我在WayPoint类中创建了一个Position属性,我想将此属性映射到Position-column。

我尝试过:

wp.Map(x => x.Position).Column("Position");

但是这会导致MappingException:

  

NHibernate.MappingException:集合映射中的重复列:Route.WayPoints列:位置

public class RouteMap : ClassMap<Route>
{
    private const string LocationKey = "LocationIndex";
    public RouteMap()
    {
        Not.LazyLoad();
        ReadOnly();
        Id(x => x.Id).GeneratedBy.Assigned();
        Version(x => x.Version);
        Map(x => x.Time);
        References(x => x.StartingPoint).UniqueKey(LocationKey);
        References(x => x.Destination).UniqueKey(LocationKey);
        HasMany(x => x.WayPoints).Component( wp =>
            {
                wp.Map(x => x.Time);
                //wp.Map(x => x.Position).Column("Position");
                wp.Component( wp2 => wp2.Location, gl =>
                    {
                        gl.Map(x => x.Latitude);
                        gl.Map(x => x.Longitude);
                    }
                );
            }

            ).AsList(index => index.Column("Position")).Cascade.All();
    }
}


create table `Route` (
    Id VARCHAR(40) not null,
   Version INTEGER not null,
   Time BIGINT,
   StartingPoint_id VARCHAR(40),
   Destination_id VARCHAR(40),
   primary key (Id),
  unique (StartingPoint_id, Destination_id)
)

create table WayPoints (
    Route_id VARCHAR(40) not null,
   Latitude DOUBLE,
   Longitude DOUBLE,
   Time BIGINT,
   Position INTEGER not null,
   primary key (Route_id, Position)
)

是否可以映射Position属性?或者是否有另一种让HQL知道Position-index-field的方法?


2 个答案:

答案 0 :(得分:2)

我认为你根本不需要映射Position属性;如果需要查询集合的索引,可以按如下方式进行查询:

select item, index(item) from Order order 
    join order.Items item
where index(item) < 5

更多信息可在HQL Documentation

中找到

答案 1 :(得分:0)

尝试将.ReadOnly()添加到wp.Map(x => x.Position).Column("Position");这允许我将多个属性映射到同一列之前,至少当其中一个属性是引用()时。