2

このかなり基本的な質問で申し訳ありませんが、ある種のプロトタイプを非常に迅速に動作させる必要があり、これがJPAへの最初の進出です。

スナップショット項目のリストを持ち、それぞれに数値IDとSystemIDを持つクラスSystemがあります。

スナップショットにクエリを実行して、次のように言うにはどうすればよいですか。

select top 1 ID from Snapshots
where Snapshots.SystemID = X 
order by Snapshots.ID desc; 

whereクエリを配置する方法を知っていますが、「最大の」ビットをどこに配置するかわかりません。

ありがとう!!

public Snapshot GetMostRecentSnapshotByID(int systemID) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<mynamespace.Snapshot> criteria = 
            cb.createQuery(mynamespace.Snapshot.class);
    Root<mynamespace> snapshot = criteria.from(mynamespace.Snapshot.class);
    criteria.where(cb.equal(snapshot.get(Snapshot_.systemID), systemID));

    //OK -- where does this guy go?
    cb.greatest(snapshot.get(Snapshot_.id));

    return JPAResultHelper.getSingleResultOrNull(em.createQuery(criteria));
}

明確化:スナップショットクラスの次の(スニペット)@

Entity
public class Snapshot implements Serializable {



    @Id
    @GeneratedValue
    private int id;

    @ManyToOne
    @JoinColumn(name = "systemID", nullable = false)
    private System system;

特定のシステムのスナップショットを見つけるために、Systemオブジェクトを使用するのではなく、数値IDに対してクエリを実行できますか?

それが混乱していたならごめんなさい!

4

1 に答える 1

2

あなたは、jpaがテーブルと列の代わりにエンティティとプロパティを操作することについて少し混乱しています。学習している場合は、最初にjpqlを使用してクエリを実装してみることをお勧めします。

String q = "from Snapshot s where s.systemID = :systemID order by s.id desc";
TypedQuery<Snapshot> query = em.createTypedQuery(q, Snapshot.class);
query.setParameter("systemID", systemID);
return query.getFirstResult();
// return a Snapshot object, get the id with the getter

(プリミティブIDを使用する代わりに、(@ OneToMany)スナップショットをシステムエンティティにマップする方が適切でした)

次に、CriteriaBuilderを試してみることができます(ここではメタモデルを使用していません)。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object> cq = cb.createQuery();
Root<Snapshot> r = cq.from(Snapshot.class);
cq.where(cb.equal(r.get("systemID"), systemID));
cd.orderBy(cb.desc(r.get("id")));
em.createQuery(cq).geFirsttResult();

where...and...(ただし、この質問ではそうではありません)を作成したい場合は、次のようになります。

[...]
Predicate p1 = cb.equal(r.get("systemID"), systemID));
Predicate p2 = cb. /* other predicate */
cb.and(p1,p2);
[...]

編集:

特定のシステムのスナップショットを見つけるために、Systemオブジェクトを使用するのではなく、数値IDに対してクエリを実行できますか?

確かに、あなたはそのようにそれを行うことができます(システムがidという名前の@Idプロパティを持っていると仮定して):

String q = "from Snapshot s where s.system.id = :systemID order by s.id desc";
[...]

ここで、s.system.idは、s(スナップショット)のプロパティシステム(クラスSystem)のプロパティID(整数)を意味します。

または、Systemエンティティがある場合は、オブジェクトを直接比較できます。

String q = "from Snapshot s where s.system = :system order by s.id desc";
query.setParameter("system", system);
[...]

CriteriaBuilder(およびメタモデル)の使用:

Metamodel m = em.getMetamodel();
Root<Snapshot> snapshot = cq.from(Snapshot.class);
Join<Snapshot, System> system = snapshot.join(Snapshot_.system);
cq.where(cb.equal(System_.id, systemID));
[...]
于 2012-09-24T16:21:40.733 に答える