【问题标题】:Join with JPA 2 criteria API加入 JPA 2 标准 API
【发布时间】:2012-08-28 09:24:46
【问题描述】:

我有 2 个域实体的基本结构:

  1. 用户
  2. 用户详情

User 持有(拥有)UserDetails,而 UseDetails 拥有 String userName。

使用 JPA 标准 API 我想提交一个简单的查询,该查询通过给定的用户名加载用户。

在代码中,我希望它看起来或多或少像这样:

public User findByUsername(String userName) {
    CriteriaBuilder qb = entityManager.getCriteriaBuilder();
    CriteriaQuery<User> c = qb.createQuery(User.class);
    Root<User> user = c.from(User.class);
    Predicate condition = qb.equal(user.get(User_.userDetails.getuserName()), userName);
    c.where(condition);
    TypedQuery<User> q = entityManager.createQuery(c);
    List<User> result = q.getResultList();

    if (result.isEmpty()) {
        return null;
    }
    return result.get(0);
}

但这不起作用,因为在 User_.userDetails 下找不到 getuserName()。 我想这不是这样做的方法,也许我需要在这些表(User 和 UserDetails)之间实现 Join?

我该怎么做?

【问题讨论】:

    标签: jpa jpa-2.0


    【解决方案1】:

    我现在不能尝试,但我认为你必须这样做:

    Predicate condition = qb.equal(user.get(User_.userDetails).get(UserDetails_.userName), userName);
    

    【讨论】:

    • 这看起来不错,我可以试一试,但我想知道这是否是最好的\正确的方法..
    • @YogevLidor:嗯,我很确定你必须使用“路径”来实现这一点。我不确定我的语法是否 100% 正确。
    • 稍后我会看看“路径”,现在它似乎工作得很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多