JPA EntityManager 查找方法不起作用[关闭]
Posted
技术标签:
【中文标题】JPA EntityManager 查找方法不起作用[关闭]【英文标题】:JPA EntityManager find method doesn't work [closed] 【发布时间】:2016-09-21 12:54:52 【问题描述】:我想编写一个方法,通过cardId
找回customerId
,但这不起作用,Eclipse 说customerId
无法解析为变量
public CustomerMapping getCustomerMapping(String cardId)
this.getEntityManager();
return em.find(CustomerMapping.class, customerId);
@Stateless
public class CustomerMappingEJB
private EntityManager em;
private void getEntityManager()
em = MultiTenantEntityManagerFactory.getEntityManager();
private void beginTransaction()
em.getTransaction().begin();
private void commitTransaction()
em.getTransaction().commit();
private void insert(CustomerMapping customerMapping)
em.persist(customerMapping);
public CustomerMapping getCustomerMapping(long id)
this.getEntityManager();
return em.find(CustomerMapping.class, id);
public List<CustomerMapping> getCustomerMappings()
TypedQuery<CustomerMapping> query = null;
this.getEntityManager();
query = em.createNamedQuery("AllCustomerIds", CustomerMapping.class);
return query.getResultList();
public CustomerMappingHelper getCustomerMappingHelper(String cardId)
this.getEntityManager();
return em.find(CustomerMappingHelper.class, cardId);
public CustomerMapping addNew(CustomerMapping customerMapping)
this.getEntityManager();
this.beginTransaction();
this.insert(customerMapping);
this.commitTransaction();
return customerMapping;
我没有把 MultiTenantEntityManagerFactory
类放在这里,因为我猜你不需要那个,然后我有 CustomerMapping
类和你所说的“一堆列表”,只有一些设置和获取 id、cardId 和 customerId 的方法我也没有复制它,因为如果你也想要,这将非常大,我会这样做
public class CustomerMapping
@Id
@GeneratedValue
public Long id;
@Basic
private String customerId;
@Basic
private String cardId;
@Basic
private String hashKey;
【问题讨论】:
您尚未在该方法中定义customerId
并且 customerId
未作为参数传入,未声明为变量,因此您会收到该错误。
【参考方案1】:
您可以通过cardId
使用JPQL
获得CustomerMapping
。更优化的解决方案是使用投影。
public String getCustomerMappingCustomerId(String cardId)
getEntityManager();
CustomerMapping result = first(em.createQuery(
"select c from CustomerMapping c where c.cardId = :cardId")
.setParameter("cardId", cardId).getResultList());
return result == null ? null : result.getCustomerId();
private static <T> T first(List<T> items)
return items == null || items.isEmpty() ? null : items.get(0);
【讨论】:
你写的完全不是我要求的,我的 customerId 是 String 不是 Long,其次,你通过 cardId 找到 customerId 的代码中的操作在哪里? @ECasio 我不是心灵感应者 :) 请将您的实体添加到问题中。快点,导致关闭;) @ECasio,您愿意从cardId 中找到customerId 对吗?如果是这样,那么您将从 find 方法中获取 CustomerMapping 类型的实例。稍后从同一实例中获取 customerId。 @VSK 是的,你明白我想要什么,但我仍然不知道如何实现它,我得到一个 CustomerMapping 类型的实例,稍后我将使用 get 方法从该实例中获取 cardId对吗? @ECasio 我更新了。您应该添加完整的映射,而不是一堆奇怪的字段。以上是关于JPA EntityManager 查找方法不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
我们如何让 JPA EntityManager Flush 工作
EntityManager 的 find() 方法是不是会创建 JPA 类的新实例?
如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?