nhibernate HQL을 사용하여 특정 속성을 기반으로 별도의 개체를 선택하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1800289

  •  05-07-2019
  •  | 
  •  

문제

HQL을 사용하여 특정 기준을 충족하는 특정 객체를 선택할 수있는 방법은 무엇입니까?

우리는 Top 10 구독 RSS 피드 목록을 생성하기 위해 다음을 시도했습니다 (구독 Count가 파생 된 속성 인 경우).

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss 
                                                 FROM RssFeedSubscription rss
                                                 group by rss.FeedUrl
                                                 order by rss.SubscriptionCount DESC
                                                 ")
.SetMaxResults(10)
.List<RssFeedSubscription>();

여기서 의도는 데이터베이스에서 객체로 인스턴스화 된 10 행이 아니라 데이터베이스에서 두 개의 고유 한 피드 URL을 선택하는 것입니다. 위의 결과는 다음과 같습니다.

Column 'RssSubscriptions.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

데이터베이스에서 데이터를 다시 얻은 후 두 개의 고유 한 피드 URL을 꺼내도록 결과를 얇게 만들 수 있지만 HQL을 사용하여 DB 레벨에서이를 수행 할 수있는 방법이 있어야합니까?

편집 : 스칼라 쿼리를 수행 한 다음 수동으로 값을 가져 오는 것이 가능하다는 것을 알고 있지만 단순히 철회 된 개체의 일치 기준을 단순히 지정하는 방법이 없습니까?

도움이 되었습니까?

해결책

HQL을 조금 바꾸면 다음과 같이 보입니다.

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss.FeedUrl
                                          FROM RssFeedSubscription rss
                                          group by rss.FeedUrl
                                          order by rss.SubscriptionCount DESC
                                        ")
.SetMaxResults(10)
.List();

Topten 변수는 2 개의 피드 URL이있는 2 개의 요소가있는 객체 []가됩니다.

iquery 인터페이스의 setResultTransformer () 메소드를 사용하는 경우 이것을 강력하게 입력 한 컬렉션으로 반환 할 수 있습니다.

다른 팁

스칼라 쿼리를 수행해야합니다. 다음은 nhibernate 문서의 예입니다.

IEnumerable results = sess.Enumerable(
    "select cat.Color, min(cat.Birthdate), count(cat) from Cat cat " +
    "group by cat.Color"
);
foreach ( object[] row in results )
{
    Color type = (Color) row[0];
    DateTime oldest = (DateTime) row[1];
    int count = (int) row[2];
    .....
}

그건 group by rss.FeedUrl 그것은 당신에게 문제를 일으키고 있습니다. 엔티티 자체를 선택하고 있기 때문에 필요한 것처럼 보이지 않습니다. 그것을 제거하면 당신이 좋을 것이라고 생각합니다.

편집 - 내 사과는 "파생 된 속성"에 대한 부분을 눈치 채지 못했습니다. 그로 인해 나는 그것이 당신이 그것이 최대 절전 모드 매핑 된 속성이 아니기 때문에 실제로 테이블에 열이 없다고 생각합니까? 쿼리에서받은 두 번째 오류 메시지를 설명합니다. "주문에 의한 주문"도 제거해야 할 수도 있고, 그렇다면 Java로 정렬해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top