0

django から Java に切り替える予定です。理由は聞かないでください :)。Play フレームワークを使用することにしました。私が必要としているのは、オブジェクト指向アプローチとネイティブ sql を混在させることができる ORM です。

django の例のようなもの: https://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

これらの機能を備えた Java の世界はありますか?

Django の ORM ワールドの例、2 つのモデル: blog と blogEntry (1->N の関係)。カウントされた blogEntry 要素を持つすべてのブログを選択しています。

Blog.objects.extra(
    select={
        'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
    },
)
4

1 に答える 1

1

JPA は、Java の標準的な永続化 API であり、その JPQL クエリ言語を使用します。

という名前の永続クラスがあり、これには という名前のクラスのインスタンスのセットを参照する というBlog名前のプロパティがあるとします。entriesBlogEntry

Blogs次のクエリを使用して、すべてを独自に取得できます。

select b from Blog b

entries次に、プロパティを介して結合し、によってグループ化された結果をカウントすることにより、エントリ数を取得することもできますBlog

select b, count(e) from Blog b join b.entries e group by b

これを行うと、クエリはオブジェクト配列のリストを返します。各配列には、カウントのaBlogと aが含まれます。Longこれをもう少しタイプセーフにしたいかもしれません。BlogWithCount次のようなコンストラクターを持つクラスを作成した場合:

public BlogWithCount(Blog b, long count)

次に、コンストラクター式を使用できます。

select new org.example.BlogWithCount(b, count(e)) from Blog b join b.entries e group by b

このクエリはBlogWithCountオブジェクトのリストを返します。このリストから、適切な方法で結果を取得できます。

この回答を最初に書いたとき、次のようにカウントクエリのより単純なバージョンを書くことができると思いました:

select b, count(b.entries) from Blog b

しかし、これは少なくとも Hibernate 4.1.4 では機能しません。仕様を見ると多分動くはずなので、これはバグかもしれません。わからない。

于 2012-11-20T16:29:45.973 に答える