2013-06-08 21 views
8

JPA(eclipselink)の基準apiを使用して次の文を作成しようとしていますが、一部のカテゴリにユーザーが存在するかどうか尋ねるのは簡単ですjpa基準では、 "少なくとも1行が真を返す場合"

は、文は私がしたい:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Boolean> criteriaQuery = criteriaBuilder.createQuery(Boolean.class); 
Root<T> root = criteriaQuery.from(tclass); 

Subquery<T> subquery = criteriaQuery.subquery(tclass); 
Root<T> subroot = subquery.from(tclass); 
subquery.select(subroot); 

Predicate subPredicate = criteriaBuilder.equal(subroot.get("category"),category); 
subquery.where(subPredicate); 

Predicate predicateExists = criteriaBuilder.exists(subquery); 

Case<Boolean> booleancase = criteriaBuilder.<Boolean>selectCase(); 
Expression<Boolean> booleanExpression = 
    booleancase.when(predicateExists,true) 
    .otherwise(false); 

criteriaQuery.select(booleanExpression); 

TypedQuery<Boolean> typedQuery = entityManager.createQuery(criteriaQuery); 
typedQuery.getResultList(); 

悲しいことに、私が持っている文は、私は「利用者からの」最後を消去し、フォローしたいされています:私はこのコードを使用しようとして

SELECT 
    CASE 
    WHEN EXISTS 
      (SELECT * FROM user WHERE category = ?) 
    THEN true 
    ELSE false 
    END 
bind => [10] 
SELECT 
    CASE 
     WHEN EXISTS 
      (SELECT ? FROM user t1 WHERE (t1.category = ?)) 
    THEN ? 
    ELSE ? 
    END 
FROM user t0  
bind => [1, 110, true, false] 

+0

? – perissf

+0

申し訳ありませんが、それは副主義のサブルーチンでした。私はstackoverflowで間違って書く(私はすでに質問を修正する)。ありがとう、しかしそれは私の問題を解決しません:P – Troncador

+0

あなたは、単純で明確なSQLクエリを持っている場合、なぜこの複雑で読めないJavaコードが必要ですか? – jbaliuka

答えて

0

は最後に、私は回避:P

TypedQuery<Boolean> typedQuery = 
    entityManager.createQuery(criteriaQuery).setMaxResults(1); 

はその後の文章が(同じではありませんが、非常に近いです):あなたが代わりにルートのサブルートを使用している場合subPredicateで、何が起こる

SELECT 
    CASE 
     WHEN EXISTS 
      (SELECT ? FROM user t1 WHERE (t1.category = ?)) 
    THEN ? 
    ELSE ? 
    END 
FROM user t0 LIMIT ?, ? 
bind => [1, 110, true, false,0,1] 
1

残念ながら、JPAではエンティティ(テーブル)なしでデータを選択することはできません。標準のSQL92ではこれをサポートしていません - 異なるデータベースでテーブルなしで選択する方法を見てください。http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Select_queries/Select_without_tables

SQL92標準では、SELECT句にテーブルを指定する必要があります。

JPAも広く受け入れられている標準であり、通常は非標準機能を提供せず、多くの標準SQL機能も最新バージョンのJPAのみに含まれています(たとえば、ネストされた選択項目は最近JavaEE 7のJPA 2.1でのみ使用されました)。

解決策は、データベースに少なくとも1つの行が常にあるエンティティから選択し、query.setMaxResults(1)によって結果を最大1に制限することです。ダミーエンティティを作成することは、常に1行あり、その内容は決して変更されません。これにより、選択のパフォーマンスが向上します。

関連する問題