NHibernate HQLを使用して特定のプロパティに基づいて個別のオブジェクトを選択する方法は?

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

  •  05-07-2019
  •  | 
  •  

質問

HQLを使用して、特定の条件を満たす特定のオブジェクトを選択するにはどうすればよいですか?

次のことを試して、購読している上位10のRSSフィードのリストを生成しました(SubscriptionCountは派生プロパティです):

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行ではなく、データベース内の2つの一意のフィード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.

データベースからデータを取得した後、2つの一意のフィード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つの要素を持つobject []になります。

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];
    .....
}

問題の原因となっているのは、rss.FeedUrlによる group です。エンティティ自体を選択しているため、必要なようには見えません。それを削除すると、あなたはうまくいくと思います。

編集-「申し訳ありませんが、「派生プロパティ」に関する部分に気付きませんでした。それは、Hibernateにマップされたプロパティではなく、したがって実際にテーブルに列がないという意味だと思いますか?これで、クエリで受信した2番目のエラーメッセージが説明されます。 「注文」を削除する必要がある場合があります。同様に、Javaで並べ替えを行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top