[解決済み] JPA と Criteria API - 特定のカラムのみを選択する
2023-06-16 10:46:22
質問
特定のカラムだけを選択したい(例.
SELECT a FROM b
). 汎用のDAOを持っていて、思いついたのは
public List<T> getAll(boolean idAndVersionOnly) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<T> criteria = builder.createQuery(entityClazz);
Root<T> root = criteria.from(entityClazz);
if (idAndVersionOnly) {
criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR
} else {
criteria.select(root);
}
return manager.createQuery(criteria).getResultList();
}
そして、エラーは
The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>)
. どのように変更すればいいのでしょうか?私は型を
T
オブジェクトを取得したい。
ID
と
VERSION
フィールドがあり、その他はすべて
null
.
タイプ
T
拡張
AbstractEntity
を継承しており、この2つのフィールドを持っています。
entityClazz
は
T.class
.
どのように解決するのですか?
特定のカラムだけを取得するJPAの方法のひとつは、カラムを取得するために タプル オブジェクトを求めることです。
あなたの場合、このように書く必要があります。
CriteriaQuery<Tuple> cq = builder.createTupleQuery();
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION)); //using metamodel
List<Tuple> tupleResult = em.createQuery(cq).getResultList();
for (Tuple t : tupleResult) {
Long id = (Long) t.get(0);
Long version = (Long) t.get(1);
}
もう一つの方法として、結果を表すクラスとして
T
のように、結果を表すクラスがある場合です。
T
はEntityクラスである必要はありません。もし
T
のようなコンストラクタを持つ場合。
public T(Long id, Long version)
であれば
T
の中で直接
CriteriaQuery
のコンストラクタに追加します。
CriteriaQuery<T> cq = builder.createQuery(T.class);
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION)); //using metamodel
List<T> result = em.createQuery(cq).getResultList();
これを見る リンク を参照してください。
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
javaの非静的メソッドを静的に参照することができない
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
java send https request prompt java.security.cert.について。
-
Java基礎編 - オブジェクト指向
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み】JPAとHibernate - Criteria vs. JPQL or HQL
-
[解決済み】Spring JPAで特定のカラムを選択する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
型に解決できない エラー解決
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
無効なメソッド宣言
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
java.sql.SQLException: 結果セットの開始前
-
maven レポート エラー 解決不可能な親POM
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
[解決済み】Spring JPAで特定のカラムを選択する方法