これはサンプルのエンティティである:JPA基準のクエリグループIDのみ
public class Account{
@Id
Long id
Double remaining;
@ManyToOne
AccountType type
}
public class AccountType{
@Id
Long id;
String name;
}
今、私は基準のクエリを作成するには、follwingとして参加:
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createquery();
Root<Account> accountRoot = criteriaQuery.from(Account.class);
Join<Account, AccountType> typeJoin = accountRoot.join(Account_.type);
criteriaQuery.multiSelect(
typeJoin,
criteriaBuilder.sum(accountRoot.get(Account_.remaining))
);
criteriaQuery.groupBy(typeJoin);
Query query = getEntityManager().createQuery(criteriaQuery);
query.getResultList();
上記のコードは次のようにSQLコマンドを生成
select accType.id, accType.name, sum(acc.remaining)
from account acc join accType on acc.accounttype_id = accType.id
group by accType.id
PosgreSQLのコードの作業の上にそれにdoesnのaccType.nameを選択するため、オラクルでは実行できません。次group by節に現れません。
更新:
私の質問はあなたにとってはっきりしないと思います。私の質問は、group by
のPostgreSQLまたはOracleの動作に関するものではありません。私はgroup by
句(これは私がgroup by
での使用にAccountTypeのすべてのフィールドを休止期待する意味)でtypeJoin
を使用していますが、なぜ単にgroup by
上のIDフィールドを使用して休止状態
:私の質問はこれですか?私はgroup by
でちょうどアイデンティティフィールドを使用するならば、私は、次のステートメントを使用することができます。
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;
これはお勧めできません。このソリューションではいつでもAccountTypeが変更されました。ほとんどの場合、すべてのクエリが変更されます。もちろん私は反射でそれを処理することができますが、私はそれのためのよりよい解決策でなければならないと思う。休止状態がすべてのエンティティプロパティを含むことはできませんか? –
accountType.idを指定し、その後に2次キャッシュを使用してロードすることができます。 –
もちろん、JPAメタモデルを使用してエンティティタイプのすべての属性を取得し、それらをジェネリックであるグループに入れることもできます。 –