2011-09-12 32 views
0

假设两个类别ProductProductTranslation。该产品有一个属性Product.Title,这是一组ProductTranslation。 如果我有两种语言,例如ende在我的系统中,Product.Title的集合将为每个产品保存两个条目。根据特定语言订购一组翻译

有没有什么方法可以制定一个HQL,它返回给我一个产品清单,按特定的语言(例如, en?或者这种排序只能在内存中的DB访问之后进行,例如与Linq或任何比较?

Thx任何想法! sl3dg3

编辑:尽管订购我仍然想收到全套ProductTranslation

回答

0

我想出了一个可能的解决方案:它可以用做双连接:

FROM Product AS product 
INNER JOIN FETCH product.Translations ordered_trans 
INNER JOIN FETCH product.Translations trans 
WHERE ordered_trans.language = 'en' 
ORDER BY ordered_trans.Title ASC 
0

不清楚您是指使用特定文化进行排序,还是仅根据匹配的翻译进行简单排序。如果是后者,那听起来就像是一个连接。在LINQ它会是这样的:

string language = "en"; 
var query = from product in db.Product 
      join translation in db.ProductTranslation 
            .Where(t => t.Language == language) 
       on product.Id equals translation.productId 
      orderby translation.Title 
      select new { Product = product, translation.Title }; 

我不知道相当于HQL是什么,但我敢肯定HQL处理,没有任何问题加入...(如果你可以使用LINQ到NHibernate的,应该处理它的罚款太粗)

编辑:只是看HQL文档,我怀疑可以使用

from Product as product 
inner join fetch product.Translations translation 
where translation.language = 'en' 
order by translation.title asc 
+0

我是指根据特定文化进行排序。如果我打英文,我希望根据英文翻译订购标题,否则根据德文翻译。是的,使用linq是没有问题的,但是我仍然无法确定如何使用HQL。 – sl3dg3

+0

@ sl3dg3:不,我认为你错过了我关于文化和标题的观点 - 不同的文化会以不同的方式排列相同的文字。编辑*尝试*一些HQL ... –

+0

@ Jon:是的,文化当然是重要的。但为了简单起见,应该命令文化不变。至于你的例子,我错过了一个重要的观点:我想收到整套语言。在这种情况下,我只会收到英文。另一个重要的观点:'ProductTranslation'没有任何映射的反向引用。我认为这两个关键点不可能...... – sl3dg3