には通常、ジェネリック パラメータが指定されますTypedQuery
。a を宣言した場合、列を射影していて完全なエンティティを返さない ためTypedQuery
、 anObject[]
を のジェネリック パラメータとして使用します。TypedQuery
ただし、(簡潔なコーディング スタイルを使用して) を宣言していないため、オブジェクトを選択せずに 2 つのフィールドのみを選択するTypedQuery
ように変更する必要がありDebit.class
ます。Object[].class
Object[] result = entityManager.createQuery("select dd, MAX(dd.createdMillis) from T_DEBIT dd" +
" where dd.debitStatus in (:debitStatus)" +
" and dd.account = :account" , Object[].class) //Notice change
.setParameter("debitStatus", false)
.setParameter("account", account)
.getSingleResult();
このクエリを実行すると、 select ステートメントのフィールドに対応するObject[]
各インデックスが返されます。Object[]
例えば:
result[0] = dd
result[1] = max(dd.createdMillis)
を使用しObject[]
ないようにするには、新しいクラスを作成して、より厳密に型指定された方法でこれらの値を取得できます。何かのようなもの:
public class Result {
String dd;
Date createdMillis;
public Result(String dd, Date createdMillis) {
super();
this.dd = dd;
this.createdMillis = createdMillis;
}
public String getDd() {
return dd;
}
public void setDd(String dd) {
this.dd = dd;
}
public Date getCreatedMillis() {
return createdMillis;
}
public void setCreatedMillis(Date createdMillis) {
this.createdMillis = createdMillis;
}
}
次に、JPQL ステートメントでコンストラクターを呼び出すことができます。
Result result = entityManager.createQuery("select NEW fully.qualified.Result(dd, MAX(dd.createdMillis)) from T_DEBIT dd" +
" where dd.debitStatus in (:debitStatus)" +
" and dd.account = :account" , Result.class)
.setParameter("debitStatus", false)
.setParameter("account", account)
.getSingleResult();
最近、私はこの正確なトピックについてブログを書いています。私が作成したこのビデオ チュートリアルをご覧になることをお勧めします: https://tothought.cloudfoundry.com/post/16