[英]How do I use the Criteria API to query primitive types in a many-to-many relationship?
我有一個“書簽”實體,其中包含字符串標記。 在C#中,書簽Poco類似於:
public class BookmarkEntity
{
public virtual Guid Id { get; set; }
public virtual ISet<string> Tags { get; set; }
}
我已經使用此覆蓋自動映射了實體:
public class BookmarkEntityMappingOverride : IAutoMappingOverride<BookmarkEntity>
{
public void Override(AutoMapping<BookmarkEntity> mapping)
{
mapping.HasManyToMany(x => x.Tags).AsSet().Element("Value").Not.LazyLoad();
}
}
這將生成以下兩個表:
create table "BookmarkEntity" (
Id UNIQUEIDENTIFIER not null,
primary key (Id)
)
create table Tags (
BookmarkEntity_id UNIQUEIDENTIFIER not null,
Value TEXT,
constraint FK9061CD2928F7F2F9 foreign key (BookmarkEntity_id)
references "BookmarkEntity"
)
現在,我希望能夠從SQLite支持的數據庫中獲得唯一的標記集。 目前,我正在執行以下查詢:
SELECT DISTINCT Value FROM Tags ORDER BY Value
這可以實現我想要的功能,但是我想使用Criteria API使其具有更強的類型。 我從這個努力開始:
Session.CreateCriteria<BookmarkEntity>()
.SetProjection(
Projections.Distinct(Projections.Property<BookmarkEntity>(b => b.Tags)))
.AddOrder(Order.Asc(Projections.Property("Value")))
.List<string>();
但這是行不通的,因為它試圖查詢“書簽”表。 我需要怎么做才能使其類似於我的硬編碼SQL查詢?
我建議遵循這些
要通過集合過濾(WHERE),我們可以使用:帶"MyArray.elements"
構造
.Add(Restrictions.Eq("Tags.elements", ...));
要進行SELECT,我們必須添加別名(目標大學),查詢將如下所示:
Session.CreateCriteria<BookmarkEntity>()
.CreateAlias("Tags", "t")
.SetProjection(
// Projections.Distinct(Projections.Property<BookmarkEntity>(b => b.Tags))
Projections.Distinct(Projections.Property("t.elements"))
)
.AddOrder(Order.Asc(Projections.Property("t.elements")))
.List<string>();
我還建議在值類型集合( IList<string>
)的情況下僅使用HasMany
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.