2010-08-27 4 views
1

J'essaie de mapper une liste avec une colonne d'index. Cela fonctionne bien, mais j'aimerais aussi pouvoir interroger la colonne d'index de HQL. Quand je fais cela HQL déclenche une exception:Mappage d'une propriété à une colonne d'index

NHibernate.QueryException: ne pouvait pas résoudre la propriété: Position: composant [Lieu, date]

Pour pouvoir interroger la colonne de WayPoint.Position HQL, j'ai créé une propriété Position dans la classe WayPoint, et je voudrais mapper cette propriété à la colonne Position.

J'ai essayé avec:

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

Mais cela se traduit par un MappingException:

NHibernate.MappingException: colonne répétée dans la cartographie pour la collecte: colonne Route.WayPoints: Position

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) 
) 

Est-il possible de mapper la propriété Position? ? Ou existe-t-il une autre approche pour rendre HQL conscient du champ Position-index?


Répondre

2

Je ne pense pas que vous ayez besoin de mapper la propriété Position du tout; si vous avez besoin d'interroger sur l'index d'une collection, vous pouvez le faire comme suit:

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

Plus d'informations peuvent être trouvées dans le HQL Documentation.

+0

Merci, exactement ce que je cherchais. Readonly() ne le fait pas pour les colonnes d'index. –

0

Essayez d'ajouter .ReadOnly() à votre wp.Map(x => x.Position).Column("Position"); Cela m'a permis de mapper plusieurs propriétés dans la même colonne auparavant, du moins lorsque l'une d'entre elles était une référence().

+0

Il y a toujours un conflit. Merci pour la réponse. –

Questions connexes