これはサンプル エンティティです。
public class Account{
@Id
Long id
Double remaining;
@ManyToOne
AccountType type
}
public class AccountType{
@Id
Long id;
String name;
}
ここで、次のように Join を使用して基準クエリを作成します。
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 では機能しますが、Oracle では実行できません。これは、group by 句に表示されない accType.name を選択するためです。
更新:
私の質問はあなたにとって明確ではないと思います。私の質問は、.NET での PostgreSQL や Oracle の動作に関するものではありませんgroup by
。私の質問はこれです:
私はtypeJoin
ingroup by
句を使用します(これは、休止状態が AccountType のすべてのフィールドを in で使用することを期待することを意味しますgroup by
)が、なぜ休止状態が単に ID フィールドを on で使用するのgroup by
ですか? ID フィールドのみを使用するgroup by
場合は、次のステートメントを使用できます。
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;