2016-07-21 1 views
3

を探して構築:JPAは、私たちは、オブジェクトにデータをマッピングするJPAs <code>construct()</code> APIを使用しようとしているが、残念ながら型変換を無視するように思われる間違ったコンストラクタのため

java.lang.NoSuchMethodException: DailyReportDto.<init>(java.lang.Integer, java.lang.Integer, java.lang.Double) 
:中

CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); 
CriteriaQuery<ReportDto> q = cb.createQuery(ReportDto.class); 
q.select(cb.construct(DailyReportDto.class, r.get(createdYear), 
    r.get(KpiSnapshot_.createdDay), 
    cb.toLong(cb.avg(r.get(KpiSnapshot_.value))))); 

結果私には意味がありません

toLongのでいけない、ダブルを探してからそれを防ぐ必要がありますか?

答えて

1

toLongと新しい表現を作成したり、とにかくでそれらを変更しないという形の他のCriteriaBuilder方法 - 彼らは表現のジェネリック型を変更、鋳造のために使用されています。式はまだb.avg(r.get(KpiSnapshot_.value))になりますが、それでもDoubleになります。

あなたのコンストラクタは、必要に応じてロングにダブル変換処理する必要があります。

+0

私はあなたの、について説明を得ることはよく分かりません。 toLongコールの後に式があっても、それでもDoubleを返しますか? – Nitek

+0

はい。何かをキャストするのと同じです。オブジェクト自体は変更されません。表現が二重を返そうとしていたとしても、それはまだ残っています。これは、あなたはそれが返さロングタイプで、そのようにそれを使用する必要があります知っているかもしれ式などの他の表現、のためのものです。 – Chris

+0

奇妙ですが、(なんとか)意味があります。しかし、expresion.as(Long.class)は動作しませんか? javadocsによると、新しいExpressionオブジェクトが作成されています。それとも、元のExpressionの単なる型キャストされたクローンですか? – Nitek

関連する問題

 関連する問題