EntityManager通过joinColumn查询

时间:2012-10-16 05:14:04

标签: java jpa entitymanager joincolumn

我有一个Login实体和一个Customer实体。 Login.username是customer表中的外键。因此,Java Customer POJO

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

我的问题是:是否有一种使用customer查询username表的简单方法?或者我必须首先按login提取username,然后customer提取login吗?

以下是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<String> path = root.<String>get("username")行正在抛出一个例外username ... is not present.

2 个答案:

答案 0 :(得分:7)

使用JPQL的正确解决方案是

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

答案 1 :(得分:3)

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

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