14

EntityManager.find(Class entityClass, Object primaryKey)主キーを使用して特定の行を検索する方法があります。

しかし、一意の値を持ち、主キーではない値を列で見つけるにはどうすればよいですか?

4

3 に答える 3

16

TypedQueryで適切なJPQLを使用できます

try {
    TypedQuery<Bean> tq = em.createQuery("from Bean WHERE column=?", Bean.class);
    Bean result = tq.setParameter(1, "uniqueKey").getSingleResult();
} catch(NoResultException noresult) {
    // if there is no result
} catch(NonUniqueResultException notUnique) {
    // if more than one result
}
于 2012-06-14T13:50:33.750 に答える
12

たとえば、次のようになります。

List<T> results = em.createQuery("SELECT t FROM TABLE t", T.class)
                        .getResultList();

パラメータ付き:

List<T> results = em.createQuery("SELECT t FROM TABLE t where t.value = :value1")
                        .setParameter("value1", "some value").getResultList();

単一の結果の場合は、次のように置き換えgetResultList()ますgetSingleResult()

T entity = em.createQuery("SELECT t FROM TABLE t where t.uniqueKey = :value1")
                 .setParameter("value1", "KEY1").getSingleResult();

もう1つの方法は、CriteriaAPIを使用することです。

于 2012-06-14T13:45:04.333 に答える
2

JPQL、Criteria、またはSQLのいずれかのクエリを使用できます。

find()と同様のキャッシュヒットを取得することに関心があるかどうかはわかりません。EclipseLink 2.4では、非主キーフィールドにインデックスを付け、JPQLまたはCriteriaからキャッシュヒットを取得できるように、キャッシュインデックスが追加されました。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Indexesを参照して ください。

2.4より前では、メモリ内クエリを使用して、非IDフィールドのキャッシュをクエリできました。

于 2012-06-14T14:26:02.160 に答える