如何使用EclipseLink在只有唯一值的列中查找一个值?

14
你可以使用 EntityManager.createQuery(String qlString, Class resultClass) 方法来查询指定实体类中某个具有唯一值的列。该方法将使用JPQL(Java 持久化查询语言)查询语句,其中包括选择语句和过滤条件。
4个回答

16

你可以使用适当的JPQL和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
}

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();

要获取单个结果,请使用getSingleResult()替换getResultList()

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

另一种方法是使用 Criteria API。


2
谢谢你的回答。我知道我可以用查询来做到这一点,我只是想知道是否可以通过使用 JPA 的某种方法,如 EntityManager.find(),以更少的代码更快地完成它。 - Rox

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字段上的缓存。

0

简而言之:

在DSL级别中 - JPA,之前的回答中没有提到实践方法。

如何在一个只有唯一值且不是主键的列中查找值?

javax.persistence.EntityManager的根接口中没有自定义字段查询的规范,您需要使用criteria基础查询。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<R> criteriaQuery = criteriaBuilder.createQuery(EntityType.class)
Root<R> root = criteriaQuery.from(type);
criteriaBuilder.and(criteriaBuilder.equal(root.get(your_field), value));

你也可以将谓词分组并一起传递。

andPredicates.add(criteriaBuilder.and(root.get(field).in(child)));
criteriaBuilder.and(andPredicates.toArray(new Predicate[]{});

并使用调用结果(无论是单个实体还是实体列表)

entityManager.createQuery(suitable_criteria_query).getSingleResult();
entityManager.createQuery(suitable_criteria_query).getResultList();
                           

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接