5

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

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

我的问题是:有没有一种简单的方法来customer使用查询表username?还是我必须先取login然后usernamecustomerlogin

这是 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.

4

2 回答 2

8

JPQL 的正确解决方案是

Query q = entityManager.createQuery("SELECT c FROM Customer c WHERE c.login.username = :username");
    q.setParameter("username", username);
    return (Customer) q.getSingleResult();
于 2012-10-19T18:56:32.810 回答
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();

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

于 2012-10-16T06:53:51.697 回答