2009-03-17 14 views
2

Ich habe eine "Item" -Klasse, und diese Klasse hat eine Sammlung "Tags".Abfrage auf Sammlung von Zeichenfolgen mit NHibernate

mein DB sieht wie folgt aus:

Items 
    Id 

Tags 
    ItemId 
    TagName 

ich alle Einzelteile zu bekommen versuche, die die Tags "x" und "y" haben. Wie kann ich dies mit NHibernate (vorzugsweise mit Kriterien-API) tun? Ist es überhaupt möglich?

Danke.

EDIT: kann ich tun, ohne das Tag-Objekt zuzuordnen? Es muss nicht 1 Abfrage sein. So etwas wie

  1. var q = Abfrage, die alle IDs der Objekte zurück, die Tag-x oder Tag-y haben“.

  2. var res = Abfrage, die alle Einzelteile mit Id in (q zurück. Execute())

+0

Sie sollten ein zugeordnetes Tag-Objekt haben und dann Stuart Childs Lösung funktionieren würde. – gcores

+0

Kann ich es tun, ohne das Tag-Objekt zuzuordnen, nur die Zeichenfolgenliste verwendend? –

+0

Ich habe die identische Zuordnung, obwohl für andere Dinge als Tagging, und habe kein Glück zu versuchen, dies zu arbeiten. Da die Daten so trivial sind (nur eine Zeichenkette), möchte ich es vermeiden, sie als separate Klasse abzubilden. Schätze, ich muss ... – Liedman

Antwort

2

so etwas wie dieses Versuchen:

session.CreateCriteria(typeof(Item)) 
    .CreateCriteria("Tags", global::NHibernate.SqlCommand.JoinType.InnerJoin) 
    .Add(Expression.Eq("TagName", "x")) 
    .Add(Expression.Eq("TagName", "y")) 
    .List() 

EDIT: Stellen Sie sicher, dass Sie eine bidirektionale Verbindung zwischen Item und Tag haben. In Fluent, würde dies in etwa so aussehen:

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     ... 
     HasMany(x => x.Tags).Inverse(); 
     ... 
    } 
} 

public class TagMap : ClassMap<Tag> 
{ 
    public TagMap() 
    { 
     ... 
     References<Item>(x => x.Item); 
     ... 
    } 
} 
+0

Es hat nicht funktioniert. Ich bekomme NHibernate.MappingException: Sammlung war keine Assoziation: Item.Tags –

+0

Siehe gcores Kommentar und dann meine Bearbeitung für ein Beispiel. –

+0

Ich weiß, wie man es mit dem gemappten Tag-Objekt macht, ich hoffte, dass es einen Weg gibt, dies zu tun, ohne Tag-String einem Objekt zuzuordnen. –

1

denke ich das Problem Ihr mit diesem verbunden ist, bekommen: https://www.hibernate.org/117.html#A2 - das heißt Sammlungen von Strings/Komponenten können nicht auf diese Weise unter Verwendung der Kriterien API abgefragt werden.

arbeitete ich, um das Problem HQL verwenden, wie in der verknüpften FAQ heißt es:

session.CreateQuery("from Item item " 
    + "where :x in elements(item.Tags) and :y in elements(item.Tags)") 
    .SetString("x", X) 
    .SetString("y", Y); 

Es scheint, als beabsichtigt zu arbeiten.

2

Ich lief in letzter Zeit über das gleiche Problem und fand wirklich keine gute Lösung für mein spezielles Problem. In meiner Lösung brauchte ich ein zugeordnetes Tags-Objekt, da es etwas komplizierter war. Ich werde beschreiben, was ich getan habe, falls es jemandem hilft. Im Wesentlichen entspricht dies dem folgenden sql:

Verwandte Themen