2012-01-10 49 views
3

EJBを使用してデータベースに接続するWebアプリケーションを開発しています。from句内のJPAサブクエリ

私たちのDBモデルでは、モバイルデバイステーブルと、機能を備えた別のテーブルと、機能の値を電話モデルとマップする最後のテーブルがあります。 モデル(id_model、...) 機能(id_feature、...) model_features(id_model、id_feature、値)

我々は一致する機能の数が注文したモデルを取得するクエリを実行します。すなわち、一致するフィーチャのリスト(すなわち、1から9)、 を渡し、これらのフィーチャのうちの少なくとも1つの値として「はい」を含むすべてのデバイスを希望し、前述のようにそれらを順序付ける。

私たちは、その仕事になり、SQLクエリを作成し、それが動作します:

SELECT CONCAT(subquery.numberf*100/9,"%") AS "Features", subquery.idModel AS "ID model" 
FROM (select count(*) AS numberf, id_model AS idModel 
     FROM model_features 
     WHERE value LIKE '%Yes%' AND id_feature IN(1,2,3,4,5,6,7,8,9) 
     GROUP BY id_model) subquery 
WHERE subquery.numberf > 0 
ORDER BY subquery.numberf DESC 

我々はJPAを使用しているので、私たちはJPQLのquerysを構築するために持っているので、それがでsubquerysを含めることはできませんFROM句では、 がWHERE句にサブクエリを「渡す」ことができるかどうか、そして悪い方法でパフォーマンスに影響しないかどうか疑問に思っています。どうすればいい?

+1

あなただけのネイティブクエリを使用することはできますか?最終結果が実体ではなく集合体であるように思われる。 – wrschneider

+0

私たちはその可能性について考えましたが、もし可能ならば、私たちはjpaとやります。 thanks @ wrschneider99 – frayab

答えて

2

は最後に、私たちは、ネイティブクエリを使用して解決:

String query = "SELECT ROUND(subquery.numberf*100/" + features + ",0) AS \"matches\", m.id_model AS \"id_model\", m.name AS \"name\", m.brand AS \"brand\", m.url_pict AS \"url_picture\"" 
       + " FROM (select count(*) AS numberf, id_model AS idModel FROM model_features WHERE value LIKE '%Yes%' " 
       + "AND id_feature IN(" + idFeatures + ") GROUP BY id_model) subquery, Models m WHERE subquery.numberf > 0 " 
       + "AND subquery.idModel = m.id_model ORDER BY subquery.numberf DESC, m.name"; 
return em.createNativeQuery(query).getResultList(); 
+2

このクラスはエンティティであってはなりません。JPAによって保持されません。それは単なるDTOです。 –

+0

em.createNativeQuery(query、ModelMatches.class).getResultList();エンティティ「ModelMatches」の要素のリストを返します。エンティティでない場合は、それを実行できます – frayab

+1

このメソッドはエンティティを必要としているという理由だけで、クラスがエンティティである必要はありません。 JPAがこのオブジェクトに対して行う変更をテーブルに永続させたくないのですか?クエリ(Object []インスタンス)の結果からSQLクエリを実行し、自分でDTOインスタンスを作成することができます。 –

関連する問題