Nhibernate 기준 다른 테이블 내에서 itemID로 그룹별로 항목을 선택하십시오.
-
18-09-2020 - |
문제
public class SearchText
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
public class SearchTextLog
{
public virtual int Id { get; set; }
public virtual SearchText SearchText { get; set; }
public virtual User User { get; set; }
public virtual int SearchCount { get; set; }
public virtual DateTime LastSearchDate { get; set; }
}
.
SearchTextLog 내의 카운트의 합계에 따라 상위 5 개의 SearchText 항목을 선택하려고합니다. 현재 상위 5 개 항목을 얻으려면 먼저 쿼리를 수행 한 다음 두 번째 쿼리 내에서 결과를 사용 하여이 문제를 해결할 수있었습니다. 나는 누군가가 빛을 보여 주고이 두 개의 별도의 쿼리를 하나의 단위로 통합 할 수있는 방법을 가르쳐 지는지 궁금해하고있었습니다.
여기에있는 것입니다 :
var topSearchCriteria = Session.CreateCriteria(typeof (SearchTextLog))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("SearchText.Id"))
.Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
.AddOrder(Order.Desc("SearchCount"))
.SetMaxResults(topSearchLimit)
.List<int>();
return Session.CreateCriteria<SearchText>()
.Add(Restrictions.In("Id", topSearchCriteria.ToArray()))
.List<SearchText>();
.
편집 :
오, 아니, 나는 내 현재의 해결책이 중요한 순서로 중요한 순서를 잃을 것이라는 것을 깨달았습니다. 그래서 나는 쿼리를 확실히 통합해야합니다. : - /
편집 :
나는이 양방향 매핑을 시도했지만, 다음 명령문을 허용하기 위해서는, SearchText 항목을 반환 할 수 없다. SearchText 속성이 그룹화가 아니라는 것을 불평합니다.
return Session.CreateCriteria<SearchText>()
.CreateAlias("SearchTextLogs", "stl")
.AddOrder(Order.Desc(Projections.Sum("stl.SearchCount")))
.SetMaxResults(topSearchLimit)
.SetResultTransformer(Transformers.AliasToEntityMap)
.List<SearchText>();
.
내 무지를 변명하지만, 니시 흔들은 나에게 완전히 새로운 것이며 완전히 다른 사고 방식이 필요합니다.
해결책
OK, 저는 해결책을 알아 냈습니다.
내 질문에 따라 내 원래 솔루션은 Nhibernate가 SELECT 절에 추가하지 않고 속성별로 그룹을 수행 할 수있는 기능을 지원하지 않기 때문에 내 원래 솔루션이 작동하지 않습니다 ( 링크 텍스트 ).
그러나 어리석은 것처럼, 나는 이러한 멋진 것들을 resulttransformers라는 것으로 나타났습니다. Aliastobean 결과 변압기를 사용하면 Nhibernate는 내가 지정한 유형의 형식 내에서 동일한 이름의 속성에 각 프로젝션 항목에 각각의 투영 항목에 제공하는 별명을 자동으로 매핑합니다. 단순히 My SearchText 객체를 지정했습니다 (그러나 Sum Projection Item에 대한 totalsearchCount 속성을 추가해야 함). 그것은 내 물건을 완벽하게 채웠고 그들을 반환했습니다.
return Session.CreateCriteria(typeof(SearchTextLog))
.CreateAlias("SearchText", "st")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Alias(Projections.GroupProperty("st.Id"), "Id"))
.Add(Projections.Alias(Projections.GroupProperty("st.Text"), "Text"))
.Add(Projections.Alias(Projections.Sum("SearchCount"), "TotalSearchCount")))
.SetMaxResults(topSearchLimit)
.AddOrder(Order.Desc("TotalSearchCount"))
.SetResultTransformer(Transformers.AliasToBean(typeof(SearchText)))
.List<SearchText>();
.
나는 이것이 쉽게하기가 더 쉽지 않다는 것을 놀라게했다. 이것은 이것을 알아내는 것에 대해 약 4 ~ 5 시간의 연구와 개발을 가져갔습니다. 잘하면 내 닌자의 경험이 점점 더 많은 경험으로 쉽게 얻을 수 있습니다.
이것은 다른 누군가가 밖에서 도움이되기를 바랍니다!
다른 팁
이 작동하지 않습니까?
var critterRes = Session.CreateCriteria(typeof (SearchTextLog))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("SearchText"))
.Add(Projections.Property("SearchText"))
.Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
.AddOrder(Order.Desc("SearchCount"))
.SetMaxResults(topSearchLimit)
.List<SearchText>()
.