【问题标题】:EntityManager query by joinColumnEntityManager 通过 joinColumn 查询
【发布时间】:2012-10-06 03:40:05
【问题描述】:

我有一个Login 实体和一个Customer 实体。 Login.username 是客户表中的外键。因此,Java Customer POJO 中的以下行

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
private Login login;

我的问题是:有没有使用username 查询customer 表的简单方法?还是我必须先通过username 获取login,然后通过login 获取customer

这是 JPA 条件查询。而且,是的,我更喜欢使用条件查询。

public Customer getCustomerByUsername(String username) throws EntityNotFoundException {
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Customer> criteriaQuery = criteriaBuilder.createQuery(Customer.class);
    Root<Customer> root = criteriaQuery.from(Customer.class);
    Path<String> path = root.<String>get("username");
    criteriaQuery.where(criteriaBuilder.equal(path, username));
    return entityManager.createQuery(criteriaQuery).getSingleResult();
}

Path&lt;String&gt; path = root.&lt;String&gt;get("username") 行抛出异常,指出username ... is not present.

【问题讨论】:

    标签: java jpa entitymanager joincolumn


    【解决方案1】:
    Query q = entityManager.createQuery("SELECT c FROM Customer c JOIN Login l ON c.login=l WHERE l.username = :username");
    q.setParameter("username",username);
    List<Customer> customerList = q.getResultList();
    

    有一些技巧要记住:这都是关于对象的,而不是底层数据库。所以名称代表类、实例和字段,它们都是区分大小写的......你得到的错误意味着你的 Customer 类没有 userName 字段 - 这是真的,因为 Login 有那个......遗憾的是,我无法测试,但逻辑和意图应该很清楚。

    【讨论】:

    • 经过大量研究,我终于屈服并决定采用您的建议。我收到以下错误:... Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Error compiling the query [SELECT c FROM Customer c WHERE c.username = :username], line 1, column 33: unknown state or association field [username] of class [com.mysite.Customer]. 回想一下,我最初的问题是 Login 而不是 usernameCustomer 中的一个字段。
    • 我想通了。正如我在回复中提到的,以下工作正常:SELECT c FROM Customer c WHERE c.login.username = :username。投票支持帮助。
    • @kasavbere 嗯,即使我使用 JPA 多年,我也没有想到这个简单而好的解决方案。但这正是 JPA 的使用方式!您可以接受自己的答案,这是允许的!
    【解决方案2】:

    JPQL 的正确解决方案是

    Query q = entityManager.createQuery("SELECT c FROM Customer c WHERE c.login.username = :username");
        q.setParameter("username", username);
        return (Customer) q.getSingleResult();
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 2014-02-13
      • 2017-01-29
      • 2015-05-21
      • 2018-02-20
      相关资源
      最近更新 更多