EntityManager.find(Class entityClass, Object primaryKey)
主キーを使用して特定の行を検索する方法があります。
しかし、一意の値を持ち、主キーではない値を列で見つけるにはどうすればよいですか?
EntityManager.find(Class entityClass, Object primaryKey)
主キーを使用して特定の行を検索する方法があります。
しかし、一意の値を持ち、主キーではない値を列で見つけるにはどうすればよいですか?
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
}
たとえば、次のようになります。
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を使用することです。
JPQL、Criteria、またはSQLのいずれかのクエリを使用できます。
find()と同様のキャッシュヒットを取得することに関心があるかどうかはわかりません。EclipseLink 2.4では、非主キーフィールドにインデックスを付け、JPQLまたはCriteriaからキャッシュヒットを取得できるように、キャッシュインデックスが追加されました。
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Indexesを参照して ください。
2.4より前では、メモリ内クエリを使用して、非IDフィールドのキャッシュをクエリできました。