2012-06-14 5 views

Odpowiedz

5

Na przykład coś takiego:

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

Przy parametrach:

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

Dla pojedynczego wyniku zastąpienia getResultList() z getSingleResult():

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

Innym sposobem jest użycie Criteria API .

+2

Dziękuję za odpowiedź. Wiedziałem, że mogę to zrobić za pomocą zapytania, zastanawiałem się, czy mógłbym to zrobić szybciej za pomocą mniejszej ilości kodu przy użyciu metody JPA, takiej jak 'EntityManager.find()'. – Rox

7

Możesz użyć odpowiedniego JPQL z TypedQuery.

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 
} 
+0

Dzięki! Nie używałem wcześniej TypedQuery. Sprawdzę to! – Rox

2

Można użyć kwerendy, JPQL, kryteria lub SQL.

Nie jesteś pewien, czy twoja troska dotyczy uzyskania trafień w pamięci podręcznej podobnych do find(). W EclipseLink 2.4 dodano indeksy pamięci podręcznej, aby umożliwić indeksowanie pól klucza podstawowego i uzyskiwanie trafień w pamięci podręcznej z JPQL lub kryteriów.

See, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Indexes

Przed 2.4 można użyć kwerendy w pamięci podręcznej kwerendy na polach non-ID.