1

簡単な Play/JPA クエリを変換して基準 API を使用しようとしています。以下は、変換しようとしているクエリではありません。これはさらに単純です。最初から何かを成功させようとするだけです。

私がオンラインで見つけたすべての例では、クラス名に _ が追加されたクラスを使用できることを期待しています。これは、生成された SQL で休止状態のクエリがテーブル名のエイリアスに対して行うのと同じようにです。ただし、クラスがないため、この方法でコードをコンパイルすることはできません: ExtendedHaulTrain_ (ただし、ExtendedHaulTrain はあります)

ExtendedHaulTrain クラスに追加する必要がある何らかの注釈はありますか? おそらく私は十分に深く読んでいませんが、これまでに見つけた例では、アンダーバーが追加されたクラスの問題に対処していません。

最後の行、特に ExtendedHaulTrain_ でコンパイルに失敗する私のコードは次のとおりです。

Query query = JPA.em().createQuery("select DISTINCT(x.trnType) from ExtendedHaulTrain x");
List<String> trainTypes = query.getResultList();

//as criteria query
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ExtendedHaulTrain> q = cb.createQuery(ExtendedHaulTrain.class);
Root<ExtendedHaulTrain> xhtRoot = q.from(ExtendedHaulTrain.class);
q.select(xhtRoot.get(ExtendedHaulTrain_.trnType)).distinct(true);
4

3 に答える 3

0

私のコメントで述べたように、避けたいメタモデル クラスの概念があります。以下は、条件 API を使用するように既存のクエリを変換する方法です。繰り返しますが、これは私のベルトの下で成功するためのものです。おそらく、このクエリを置き換えるつもりはありません。むしろ、Criteria API を使用する予定の別のより複雑なクエリがあります。これは、Criteria API にある程度慣れるためのものでした。おそらく、さらに質問が続くでしょう。

/*
Query query = JPA.em().createQuery("select DISTINCT(x.trnType) from ExtendedHaulTrain x");
List<String> trainTypes = query.getResultList();
*/

CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(ExtendedHaulTrain.class);
Root root = cq.from(ExtendedHaulTrain.class);
cq.select(root.get("trnType")).distinct(true);
List<String> trainTypes = JPA.em().createQuery(cq).getResultList();
于 2013-11-08T16:13:34.290 に答える
0

これらのメタモデルが気に入らないことは理解していますが、これは実際には非常に便利なものであり、コードを型安全性の安全な側に保つことができます (信じてください。クエリをさらに書き始めると、利点がわかります)。 . 利点は、いわゆるメタモデル ジェネレーター (注釈処理ツール) を使用して自動的に生成できることです。Hibernate には、たとえば 1 つのgeneratorがあります。Eclipse では、それらを生成するのは非常に簡単です。Mavenでも簡単です。それらを使用することをお勧めします。


アップデート

型の安全性とは、実際に書く必要がないことにxhtRoot.get("trynType")加えて、正しい結合型で作業することも意味します。NamedQueries と比較して、CriteriaQueries はデプロイ時にチェックされないことを忘れないでください。これは、結合結果のジェネリック部分で間違った型を削除または使用した場合 (以下の WrongOwner) を意味します。

Join<WrongOwner, Address> address = cq.join(Pet_.owners).join(Owner_.addresses);

コンパイル時にそれがわかります。

于 2013-11-08T22:40:39.970 に答える