2010-04-12 6 views
0

je suis un peu ayant des difficultés à récupérer une collection de chaînes dans une projection: dire que j'ai les classes suivantesNHibernate Projections pour récupérer une collection?

public class WorkSet { 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public ISet<string> PartTitles { get; protected set; } 
} 
public class Work { 
    public Guid Id { get; set; } 
    public WorkSet WorkSet { get; set; } 
    //a bunch of other properties 
} 

J'ai alors une liste de travail ids je veux récupérer WorkSet.Title, WorkSet. PartTitles et Id pour.

Mon tought était de faire quelque chose comme ceci:

  var works = Session.CreateCriteria<Work>() 
      .Add(Restrictions.In("Id", hitIds)) 
      .CreateAlias("WorkSet", "WorkSet") 
      .SetProjection(
      Projections.ProjectionList() 
       .Add(Projections.Id()) 
       .Add(Projections.Property("WorkSet.Title")) 
       .Add(Projections.Property("WorkSet.PartTitles"))) 
      .List(); 

Les charges ID et le titre juste bien, mais la PartTitles retourne null. Suggestions, s'il vous plaît!

+0

Vous pouvez également utiliser le chargement différé sur des propriétés uniques. –

Répondre

1

Cela peut ne pas fonctionner avec des critères. Très probablement, c'est parce que l'ensemble ne peut pas être récupéré par la même requête SQL qui est générée par les critères.

Je voudrais vraiment vraiment envisager de récupérer l'objet entier. C'est beaucoup plus facile et si ce n'est pas un cas très spécial, ça ne vaut pas le coup. (En passant, il peut être plus rapide de récupérer des objets entiers, le peut être déjà dans le cache.) Ce qui compte habituellement est le nombre de requêtes (et sa complexité bien sûr), pas le nombre de colonnes récupérées.

Il fonctionne probablement avec HQL, il y a une fonction elements là. Pensez à utiliser HQL pour les requêtes statiques de toute façon, il est plus puissant.

select 
    ws.Title, 
    elements(ws.PartTitles), 
    w.id 
from 
    Work w 
    inner join w.WorkSet ws 
where w.id in (:ids) 

elements est autorisé dans la clause select, mais je ne sais pas ce que vous obtiendrez. Vous obtiendrez probablement autant d'enregistrements que de PartTitles dans le résultat, car une seule instruction SQL est créée.

+0

Je vais l'essayer avec HQL alors, c'est un cas très particulier, en termes de performances et les classes en question sont assez encombrantes, merci! –

Questions connexes