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() 方法?

使用 EntityManager (JPA) 在 DAO 中更新 () 方法的推荐行为?

EntityManager JNDI 查找

JPA的entityManager的findgetReferencepersisitremove方法的使用