2012-01-22 28 views
2

私は次のコードを実行しようとしています:私は、私は次の例外を取得んJPQLネイティブクエリ

public BigDecimal valuate(String searchTerms, String categoryPath) { 
    Query query = em.createNativeQuery("SELECT SUM(maxBidAmount)/COUNT(maxBidAmount) FROM Item WHERE MATCH(title) AGAINST(':searchTerms') AND categoryPath=':categoryPath'", Double.class); 
    query.setParameter("searchTerms", searchTerms); 
    query.setParameter("categoryPath", categoryPath); 
    double value = (double) query.getSingleResult(); 
    return new BigDecimal(value); 
} 

Exception Description: Missing descriptor for [class java.lang.Double]. 

私はDouble.classを削除し、I別の例外を取得します。

これで、JPQLでCOUNTとSUMを使用する正しい方法が不思議です。

+0

hibernate 4とOracleドライバで明示的に指定された型がない場合は、クラスとしてNumberを取得します。これはNumber#intValue()で使用できます。 'Double.class'の代わりに' Number.class'を試してみてください。 int値=((数値)query.getSingleResult())。intValue(); – eckes

答えて

6

SQLが有効な場合は、クエリーにDouble.classを指定する必要はありません。単にem.createNativeQuery(SQLString)を使用します。 JPAプロバイダに結果からエンティティを作成させたいが、この場合は生データが必要な場合は、戻り値の型が使用されます。

+0

私はこのアドバイスをクエリパラメータを使用しないで組み合わせて、単に文字列をつなぎ合わせると、 – Kevin

+0

私の場合、BigIntegerを返します。通常、Numberにキャストします。http://stackoverflow.com/questions/8342572/retrieving-single-value-using-jpa/8342658も参照してください。 – eckes

0

ネイティブクエリは、SQL 、ないJPQLで、あなたは自分のRDBMSのための任意のSQLのようにそれらのキーワードを使用します。 JPAプロバイダが結果クラスとしてDoubleを受け入れないように見えます(結果クラスのみがエンティティになることを許可するものもあります)。

DataNucleus JPAでは、エンティティ以外の結果クラスを使用できます。

+0

はい、あなたは正しいです。それはJPQLではありません。 Doubleはシンプルなタイプなので、サポートされると思います。私は、JPA実装(Eclipse Link)の効率が低下するのではなく、誤ったアプローチだと感じています。 – Kevin

+0

JPA経由でSQLを使用する場合は、param1の代わりに番号付きのパラメータ?1、?2などを使用する必要があります。それはダブル部分を修正するのではなく、私がすでに言ったように、いくつかの実装はそれをサポートします – DataNucleus