私はJPAプロバイダとしてEclipseLinkを使用しています。JPA multiselect
オンラインで1つのCriteriaクエリを使用して特定のIDs
に対応するすべての名前を取得するクエリを作成したいとします。
Root<UserAccount> root = criteria.from(UserAccount.class);
List<Selection<?>> select = new ArrayList<Selection<?>>();
for (MyElement element : list) {
Expression<String> firstName = root.get("firstName");
Expression<String> lastName = root.get("lastName");
Expression<Integer> id = root.get("id");
select.add(criteria
.multiselect(
firstName.alias(element.getId() + "_"
+ element.getEntity() + "f"),
lastName.alias(element.getId() + "_"
+ element.getEntity() + "l"))
.where(criteriaBuilder.equal(id, element.getAuthorId()))
.from(UserAccount.class)
.alias(element.getId() + "_" + element.getEntity()));
}
criteria.multiselect(select);
TypedQuery<Tuple> q = em.createQuery(criteria);
for (Tuple t : q.getResultList()) {
for (OverviewEntity element : list) {
System.out.println("////"
+ t.get(element.getId().toString() + "_"+element.getEntity()+"f",
String.class));
element.getId() + "_" + element.getEntity() + "f"
私は一意のエイリアスを作成します。
問題は、私が得るのはnull
です。どうして? 1つのクエリでこれらをすべて取得する必要があります(時間がかかることはありません)。
なぜあなたは(ユニーク)のエイリアスを作成したいですか? element.getEntity()とは何ですか? – perissf
@perissf結果が得られたら、すべての結果がどこに当てはまるかを知りたいと考えています。 'ID'だけでは不十分です。' @ Transient'(データベースにはない)情報がいくつかあります。 – Dragos
このデザインは非常に複雑です。私は、与えられたセットのIDを持つすべてのUserAccountレコードを返すプレーンなクエリを書くでしょう。 resultListはPersistenceContextにアタッチされます。あなたは何の努力もせずにTransientプロパティを取得することができます。エイリアスを使用する必要はありません。 – perissf