5

私はLoginエンティティとエンティティを持っていCustomerます。Login.usernamecustomer テーブルの外部キーです。したがって、Java CustomerPOJOの次の行

@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.

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

覚えておくべきいくつかのトリックがあります。これはすべてオブジェクトに関するものであり、基盤となる DB に関するものではありません。したがって、名前はクラス、インスタンス、およびフィールドを表し、それらはすべて CaseSensitive です...あなたが得たエラーは、Customer クラスに userName フィールドがないことを意味していました。テストはできませんが、ロジックと意図は明確である必要があります。

于 2012-10-16T06:53:51.697 に答える