2014-01-08 1 views
5

内の要素の数でソートします。ビルJPAクライテリアAPIのクエリ - 私はJPAの基準APIを使用してクエリを構築すると、問題が生じていますコレクション

エンティティと重要な特性:

@Entity 
public class Post { 
    @Id int id; 
    @OneToMany (mappedBy = "post") Set<Comment> comments; 
    //... 
} 

@Entity 
public class Comment { 
    @Id int id; 
    @ManyToOne Post post; 
    //... 
} 

私は(PostOneToMany)コメント数順DBからのすべての投稿を返しますクエリを必要としています。

SELECT p 
FROM Post p 
ORDER BY SIZE(p.comments) DESC 

しかしSIZE(...)JPQLで、それによって注文するために使用することはできません機能: は、最初に私がこのようなJPQLで実現することができると思いました。

だから、私は約JPA Criteria APIを見つけて、次の試してみました:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Post> cq = cb.createQuery(Post.class); 
Root<Post> p = cq.from(Post.class); 
cq.select(p); 
cq.orderBy(cb.desc(p.get("comments"))); 
List<Post> resultList = em.createQuery(cq).getResultList(); 

このクエリでは、私は適切な結果を得ていないのです。私はsizeのセットの「コメント」を紛失していることを認識していますが、その部分を追加する方法はわかりません。私はJPA Criteria APIをよく知っていません。このクエリは、すべての投稿をcommentsフィールド(セット)のサイズで注文するためにどのように見えるでしょうか?

+2

あなたは、これは動作しませんよろしいです: 'cq.orderBy(。cb.desc(cb.size(P GET( "コメント")))); '? –

+0

そうでなければ、私はあなたが 'Subquery'と[CriteriaBuilder.count(式)]を使用する必要がありますと思います(http://docs.oracle.com/javaee/7/api/javax/persistence/criteria/CriteriaBuilder.html# count(javax.persistence.criteria.Expression))。 –

+0

は@MartinAnderssonはい、あなたが正しい、私は(。))cb.desc(cb.sizeた(p <コレクション>( "コメント")を取得) '' 一部なので、 'cq.orderByがあることがありませんでした;'です正しい。これを回答として投稿することができます。ありがとう。 – Vladimir

答えて

5

CriteriaBuilder.size(Expression)は、ORDER BY句で使用することができExpression<Integer>を返します。コードのこの行は:

p.get("comments") 

Expression<X>は、Collection.size引数として返される値を使用しても安全である延びPath<X> ..returns()。

しかし、以前に引用されたコード行では、Path.get()のオーバーロードされたバージョンを使用しているため、コンパイラは型パラメータXを推論できません。代わりに、型引数はObjectと仮定されます。 しかし、 Collection.size()は、 "上限"がCollection)の "パラメータ化された型"であることをExpression-parameterとして宣言しました。これは、私の答えでCriteriaBuilder.size StackOverflowは、メソッドシグネチャから型を削除することを主張しています。代わりにJavaDocsを参照してください!)。したがって、型引数を明示的に指定する必要があります。

はこれを試してみてください:

cq.orderBy(cb.desc(cb.size(p.<Collection>get("comments")))); 
+0

マーティンねえ、あなたはこの1つで私を助けることができます。http://stackoverflow.com/questions/21137719/jpql-query-for-searching-if-a-word-string-is-consisted-in-one-of- entitys-fields – Vladimir

+0

私はJPQLのコレクションサイズでordeを書く方法を尋ねますか? – wener

+0

JPA Criteria APIでこの手法を使用するにはどうすればよいですか? – plutonium1991

関連する問題